Load packages and prep data

Load packages

source('9. load_pkgs_BcellAnalysis.R')
Registered S3 method overwritten by 'data.table':
  method           from
  print.data.table     
Registered S3 method overwritten by 'htmlwidgets':
  method           from         
  print.htmlwidget tools:rstudio
Attaching SeuratObject
Loading required package: plyr
Loading required package: dplyr

Attaching package: ‘dplyr’

The following objects are masked from ‘package:plyr’:

    arrange, count, desc, failwith, id, mutate, rename, summarise, summarize

The following objects are masked from ‘package:stats’:

    filter, lag

The following objects are masked from ‘package:base’:

    intersect, setdiff, setequal, union

Loading required package: ggplot2
Loading required package: ggpubr

Attaching package: ‘ggpubr’

The following object is masked from ‘package:plyr’:

    mutate

Loading required package: MLEcell
Loading required package: sparseMatrixStats
Loading required package: MatrixGenerics
Loading required package: matrixStats

Attaching package: ‘matrixStats’

The following object is masked from ‘package:dplyr’:

    count

The following object is masked from ‘package:plyr’:

    count


Attaching package: ‘MatrixGenerics’

The following objects are masked from ‘package:matrixStats’:

    colAlls, colAnyNAs, colAnys, colAvgsPerRowSet, colCollapse, colCounts, colCummaxs, colCummins, colCumprods, colCumsums, colDiffs, colIQRDiffs,
    colIQRs, colLogSumExps, colMadDiffs, colMads, colMaxs, colMeans2, colMedians, colMins, colOrderStats, colProds, colQuantiles, colRanges, colRanks,
    colSdDiffs, colSds, colSums2, colTabulates, colVarDiffs, colVars, colWeightedMads, colWeightedMeans, colWeightedMedians, colWeightedSds,
    colWeightedVars, rowAlls, rowAnyNAs, rowAnys, rowAvgsPerColSet, rowCollapse, rowCounts, rowCummaxs, rowCummins, rowCumprods, rowCumsums, rowDiffs,
    rowIQRDiffs, rowIQRs, rowLogSumExps, rowMadDiffs, rowMads, rowMaxs, rowMeans2, rowMedians, rowMins, rowOrderStats, rowProds, rowQuantiles,
    rowRanges, rowRanks, rowSdDiffs, rowSds, rowSums2, rowTabulates, rowVarDiffs, rowVars, rowWeightedMads, rowWeightedMeans, rowWeightedMedians,
    rowWeightedSds, rowWeightedVars

Loading required package: reshape2
Loading required package: gridExtra

Attaching package: ‘gridExtra’

The following object is masked from ‘package:dplyr’:

    combine

Loading required package: patchwork
Loading required package: scales
Loading required package: RColorBrewer
Loading required package: extrafont
Registering fonts with R
Loading required package: corrr
Loading required package: gtools
Loading required package: igraph

Attaching package: ‘igraph’

The following object is masked from ‘package:gtools’:

    permute

The following objects are masked from ‘package:dplyr’:

    as_data_frame, groups, union

The following objects are masked from ‘package:stats’:

    decompose, spectrum

The following object is masked from ‘package:base’:

    union

Loading required package: corrplot
corrplot 0.95 loaded
Loading required package: pheatmap
Loading required package: BiocManager
Bioconductor version 3.19 (BiocManager 1.30.25), R 4.4.1 (2024-06-14)
Loading required package: clusterProfiler

clusterProfiler v4.12.6 Learn more at https://yulab-smu.top/contribution-knowledge-mining/

Please cite:

Guangchuang Yu, Li-Gen Wang, Yanyan Han and Qing-Yu He. clusterProfiler: an R package for comparing biological themes among gene clusters. OMICS: A
Journal of Integrative Biology. 2012, 16(5):284-287

Attaching package: ‘clusterProfiler’

The following object is masked from ‘package:igraph’:

    simplify

The following objects are masked from ‘package:plyr’:

    arrange, mutate, rename, summarise

The following object is masked from ‘package:stats’:

    filter

Loading required package: org.Hs.eg.db
Loading required package: AnnotationDbi
Loading required package: stats4
Loading required package: BiocGenerics

Attaching package: ‘BiocGenerics’

The following objects are masked from ‘package:igraph’:

    normalize, path, union

The following object is masked from ‘package:gridExtra’:

    combine

The following objects are masked from ‘package:dplyr’:

    combine, intersect, setdiff, union

The following objects are masked from ‘package:stats’:

    IQR, mad, sd, var, xtabs

The following objects are masked from ‘package:base’:

    anyDuplicated, aperm, append, as.data.frame, basename, cbind, colnames, dirname, do.call, duplicated, eval, evalq, Filter, Find, get, grep, grepl,
    intersect, is.unsorted, lapply, Map, mapply, match, mget, order, paste, pmax, pmax.int, pmin, pmin.int, Position, rank, rbind, Reduce, rownames,
    sapply, setdiff, table, tapply, union, unique, unsplit, which.max, which.min

Loading required package: Biobase
Welcome to Bioconductor

    Vignettes contain introductory material; view with 'browseVignettes()'. To cite Bioconductor, see 'citation("Biobase")', and for packages
    'citation("pkgname")'.


Attaching package: ‘Biobase’

The following object is masked from ‘package:sparseMatrixStats’:

    rowMedians

The following object is masked from ‘package:MatrixGenerics’:

    rowMedians

The following objects are masked from ‘package:matrixStats’:

    anyMissing, rowMedians

Loading required package: IRanges
Loading required package: S4Vectors

Attaching package: ‘S4Vectors’

The following object is masked from ‘package:clusterProfiler’:

    rename

The following objects are masked from ‘package:dplyr’:

    first, rename

The following object is masked from ‘package:plyr’:

    rename

The following object is masked from ‘package:utils’:

    findMatches

The following objects are masked from ‘package:base’:

    expand.grid, I, unname


Attaching package: ‘IRanges’

The following object is masked from ‘package:clusterProfiler’:

    slice

The following objects are masked from ‘package:dplyr’:

    collapse, desc, slice

The following object is masked from ‘package:plyr’:

    desc


Attaching package: ‘AnnotationDbi’

The following object is masked from ‘package:clusterProfiler’:

    select

The following object is masked from ‘package:dplyr’:

    select


Loading required package: usedist
Loading required package: lmtest
Loading required package: zoo

Attaching package: ‘zoo’

The following objects are masked from ‘package:base’:

    as.Date, as.Date.numeric

Loading required package: sandwich
Loading required package: broom
loadfonts('pdf')
theme_set(theme_classic())
my_theme <- theme(
  text = element_text(family = 'ArialMT'),
  axis.line = element_line(linewidth = 1),
  axis.ticks = element_line(linewidth = 0.5),
  axis.title = element_text(size = 10),
  axis.text = element_text(size = 8),
  legend.title = element_text(size = 8),
  legend.text = element_text(size = 8)
)
theme_update(
  text = element_text(family = 'ArialMT'),
  axis.line = element_line(linewidth = 1),
  axis.ticks = element_line(linewidth = 0.5),
  axis.title = element_text(size = 10),
  axis.text = element_text(size = 8),
  legend.title = element_text(size = 8),
  legend.text = element_text(size = 8))
  

Define custom functions

Spatial analysis functions

Create adjacency matrix

Function that creates an adjacency matrix by querying each cell for the cell types of each target cell within a certian distance X, then sums across each cell type.


# Define function
make_adj_mat <- function(
  # output of dist function  
  dist_obj, 
  # named list of cell names and cell types
  annot_list,
  # distance
  distX,
  # collapse query cells? (i.e. columns)
  collapse_query = T) {  
  
  ## retrieve matrix object from dist object
  dmat <-as.matrix(dist_obj)
  
  ## iterate through each query cell
  tmpmat <- sapply(colnames(dmat), function(cellid) {
    
    ### obtain all target cells within distX distance
    cell <- dmat[,cellid]
    cell_fil <- cell[which((cell < distX) & (cell != 0))]
    ### get the cell type of each cell and count using the annot dataframe
    out <- t(as.matrix(table(annot_list[names(cell_fil)])))
    row.names(out) <- cellid
    return(out)
  })
  
  ## put all cells together
  tmpmat <- rbind.fill.matrix(tmpmat)
  row.names(tmpmat) <- colnames(dmat)
  ## add clust to each query cell
  tmpmat <- as.data.frame(tmpmat)
  tmpmat$celltype <- annot_list[row.names(tmpmat)]
  
  ## collapse all query cells into clust as well
  if(collapse_query){
  
  outmat <- tmpmat %>% group_by(celltype) %>%
  summarise(across(everything(), ~ sum(., na.rm=T)))
  rnames <- outmat$celltype # make rownames the cell type 
  outmat <- as.matrix(outmat[,which(colnames(outmat) !='celltype')]) # remove celltype column
  row.names(outmat) <- rnames
  outmat <- outmat[colnames(outmat),] # make rownames and colnames the same order
  } else {
  outmat <- tmpmat
  }
  
  ## return the final dataframe
  return(outmat)
  
  }

Get hypergeo parameters

Going to use a hypergeometric distribution of edges ab, where a = celltype 1 (ct1), b = celltype2 (ct2), and: * x = observed number of times ab is seen in the data * m = total number of possible edges that include ab * if a != b: m = (Na * Nb) * if a == b: m = choose(Na,2) * n = total number of possible edges that DON’T include ab: [ (((Nt*Nt)-Nt)/2) - m ] (cells can’t be their own edge; draw a dummy matrix to make sense of this formula) * k = number of edges in the dataset

Note that it’s ok to add these values together across cells from the same “group”

# Define function
adj_mat_to_hypergeo_params <- function(
    # adjacency matrix
    outmat,   
    # named vector of number of cells of each type in the dataset. Names must match adjacency matrix column and row names               
    nctypes)
  { 

    # ensure that all cell types are found in each of
    ## rownames outmat
    ## colnames outmat
    ## names of nctype
    if(any(row.names(outmat) != colnames(outmat))) {
      stop("Row names and column names of outmat do not match.")
    }
      
    if(!(all(row.names(outmat) %in% names(nctypes)) & all(names(nctypes) %in% row.names(outmat)))) {
      stop("Row names of outmat and names of nctype do not match.")
    }
    
  
    ## create output dataframe:
    ### determine unique combinations of cell types
    #### sort nctypes first to make sure that the combinations are made correctly
    out <- as.data.frame(combinations(n = length(names(nctypes)),
                                        r = 2,
                                        v = sort(names(nctypes)),
                                        repeats.allowed = T))
    colnames(out) <- c('ct1', 'ct2')
  
    ## calc total number of each cell type in dataset
    nt_cell <- sum(nctypes)
    nt_edge <- sum(outmat)/2
    
    ## for each cell in the adjacency matrix, define parameters of hypergeometric distribution
    ## if output = 'hyper_fit', then determine p values and expected number of edges given the params
    
    params <- t(apply(out, 1, function(r) {
        
        ### define ct1 and ct2
        ct1 = unlist(r['ct1'])
        ct2 = unlist(r['ct2'])
      
        ### define parameters of hypergeometric distribution
        x <- outmat[ct2, ct1]
        if(ct1==ct2) {
              m <- choose(nctypes[ct1], 2)} else {
              m <- nctypes[ct1] * nctypes[ct2]}
        n <- ((nt_cell * nt_cell) - nt_cell)/2 - m
        k <- nt_edge
        
        ### return parameters
        return(c(m, n, k, x))
          
        }))
    
    out <- cbind(out, params)
    colnames(out) <- c('ct1', 'ct2', 'm', 'n', 'k', 'x')   
    return(out)  
    }
    

Fit hypergeo parameters

This function fits the data to a hypergeometric distribution and calculates fold increased interactions over expected

# Define function
fit_hyper_geo <- function(
    # the number of observed interactions between two cell ty pes
    observed_edge_n,   
    # the expected hyperparameters for those two cell types
    expec_hyperparams
    ){ 
  
  
  ## calc the expected number of edges
  expec <-  n*K/N
  
  ## calc the fold increase of observed / expected
  foldincr <- observed_edge_n / expec
  
  ## calc the p value 
  pval <- phyper(q=x,
                 m=m,
                 k=k,
                 n=n,
                 lower.tail = T,
                 log.p = T)
          
  ## return the data
  out = list(expec, foldincr, pval)
  names(out) = c('null.expec.edges', 'fold.incr.over.null', 'p.val')
  return(out)
}
  
genemods_mle_findmarkers <- function(seurat_obj, # Seurat object
                                     rawdata = NULL, # sparse counts matrix, rows = genes, columns = cells
                                     mle_negm, # vector of mean negprobe counts per cell, see "insitutype" function
                                     mle_cohort, # dataframe of parameters used for fastCohorting, see "insitutype" function
                                     mle_nclust = NULL, # vector of length 2 specifying the minimum and maximum number of clusters for MLE cell to generate
                                     logfc_min = 0.5 # minimum log2fc required for genes to be designated as marker genes of a subcluster
                                     ) {
  
  
  # define raw data if undefined
  if(is.null(rawdata)) {
    rawdata <- seurat_obj@assays$nanostrRNA@counts
  }
  
  
  # define nclust if undefined
  if(is.null(mle_nclust)) {
    mle_nclust <- c(2, 
  ## the maximum number of clusters should either be the lesser of: (a) the number of genes or (b) the number of cells / 10, assuming that clusters on average should have at least 10 cells
                    min(c(nrow(raw), round(ncol(raw)/10))))
  }
  
  
  # Perform unsupervised cell clustering
    ## Cohort cells
    mle_coho <- fastCohorting(mat = mle_cohort,
                              gaussian_transform = TRUE)
    
    
    ## Cluster cells
    mle_unsup <- insitutype(counts = t(as.matrix(rawdata)),
                            neg = mle_ngem,
                            cohort = mle_coho,
                            n_clusts = mle_nclust,
                            reference_profiles = NULL) # NULL value runs unsupervised clustering
    
    
    ## Plot clusters
    mle_hm <- heatmap(sweep(mle_unsup$profiles,
                            1,
                            pmax(apply(mle_unsup$profiles, 1, max),
                                 .2),
                            "/"),
                      scale = "none",
                      main = "Subcluster Mean Expression Profiles")
    
    
    ## Add cluster data to Seurat object
    seurat_obj <- AddMetaData(seurat_obj, 
                              data.frame(mle_unsup$clust))
  
  
  # Run Marker Gene analysis
  Idents(object = seurat_obj) <- seurat_obj@meta.data$'mle_subclust' 

  mle_subclust_markers <- FindAllMarkers(seurat_obj,
                                         only.pos = TRUE,
                                         min.pct = 0.25)
  

  # Output
  out <- list()
  out$cell_cluster_heatmap <- mle_hm
  
  return(out)
  
}

 

Load data

set.seed(0)
load("processed_data/cleaneddata.RData") # scRNAseq data
load("processed_data/cannot with distances from gloms.RData") # glomerular distance information from Patrick
context <- readRDS('processed_data/context4.RDS')
names(context) <- colnames(raw)
contam <- readRDS('processed_data/toomuchcontam.RDS') # gene contamination calls by Patrick

Pre-process data

To remove genes that are “expressed” in cells due to poor segmentation, I will use Patrick’s contamination dataset: “contaminating transcripts from imperfect cell segmentation – e.g. if a B-cell is surrounded by PCT cells, then when we occasionally draw a cell boundary wrong we’ll place some PCT transcripts in a B-cell. So if any of your clusters are driven by genes typical of another cell type, suspect an artifact. For each cell type x gene, the attached matrix measures how much the gene comes from the appropriate cell type vs. from contamination – higher values mean more pure / less contaminated data. You can use this to check if any of your B-cell cluster marker genes are contaminants. For differential expression, I’m only considering genes with values above 0.2.”

Will use cotamstat.RDS to look at the contamination rates from the gene. We can look at each statistically significant gene

Define cell types and filter genes

Distribution of gene contamination scores


cd4_tcell_types <- c( "T CD4 memory",
                      "T CD4 naive",
                      "Treg")

cd8_tcell_types <- c( "T CD8 memory",
                      "T CD8 naive")

glomcell_types <- c("Podocyte",
                    "Glomerular.endothelium",
                    "Mesangial.cell",
                    "Parietal.epithelium")

vesslcell_types <- c("Vascular.pericyte",
                     "Peritubular.capillary.endothelium.1",
                     "Peritubular.capillary.endothelium.2",
                     "Ascending.vasa.recta.endothelium",
                     "Descending.vasa.recta.endothelium")

tubcell_types <- c("Connecting.tubule",
                   "PCT",
                   "Principal.cell",
                   "Type.A.intercalated.cell",
                   "Type.B.intercalated.cell",
                   "Pelvic.epithelium",
                   "Thick.ascending.limb.of.Loop.of.Henle",
                   "Indistinct.intercalated.cell",
                   "Transitional.urothelium",
                   "Epithelial.progenitor.cell")

innate_lymph <- c("NK")

interstcell_types <- c("Myofibroblast",
                       "Fibroblast")

# Define cell types
all_cell_types <- levels(as.factor(clust))

imm_cell_types <- c("B-cell",
                    "macrophage",
                    "mast",
                    "mDC",
                    "monocyte",
                    "neutrophil",
                    "NK",
                    "pDC",
                    "plasmablast",
                    "T CD4 memory",
                    "T CD4 naive",
                    "T CD8 memory",
                    "T CD8 naive",
                    "Treg")

b_cell_types <- c("B-cell",
                  "plasmablast")

my_cell_types <- c("macrophage",
                        "mast",
                        "mDC",
                        "monocyte",
                        "neutrophil",
                        "pDC")

str_cell_types <- subset(all_cell_types,
                           !(all_cell_types %in% imm_cell_types) &
                             (all_cell_types != "NotDet"))
                    

basic_cats <- function(x) {
  if(x %in% b_cell_types) { return('bcell') } else {
    if(x %in% cd4_tcell_types) { return('tcell_cd4') } else {
    if(x %in% cd8_tcell_types) { return('tcell_cd8') } else {
      if(x %in% my_cell_types) { return('mycell') } else {
        if(x %in% glomcell_types) {return('glomcell') } else {
          if(x %in% vesslcell_types) {return('vesslcell')} else {
            if(x %in% tubcell_types) {return('tubcell')} else {
              if(x %in% interstcell_types) {return('interstcell')} else {
                if(x %in% innate_lymph) {return('NKcell')}
                return("ERROR")
              }
            }
          }
        }
      }
    }
  }
  }
}

# organize metadata
annot <- merge(annot, data.frame(clust), by.x = "cell_ID", by.y = "row.names") 
# add cell calls
row.names(annot) <- annot$cell_ID
# annotate cells with larger cell type bins
annot$basictype <- sapply(annot$clust, basic_cats)
annot$alpha <- sapply(annot$basictype, function(x) {
  if(x %in% c('tcell', 'bcell', 'mycell')) {return(1)} else
    {return(0.2)}
})
# refine annotation of cd4 and cd8 t cells, to combine cells together
subset_tmp <- which(annot$basictype %in% c('tcell_cd4', 'tcell_cd8'))
annot[subset_tmp,'clust'] <- annot[subset_tmp,'basictype']


tmp <- as.data.frame(contam[,c(b_cell_types)])
tmp$maxval <- unlist(apply(tmp, 1, max))

ggplot(tmp, aes(x = maxval)) + geom_density()


# Define contaminated genes for B cells
b_cell_uncontam <- row.names(
  data.frame(!(contam[,b_cell_types])) %>% 
    filter_all(all_vars(.))
)

Compute PCA and generate UMAP

Will use Seurat to obtain UMAP to cluster cells

# Creat Seurat Object
## prepare all annotations
annot$context <- context[annot$cell_ID]
annot <- bind_cols(annot, cannot[annot$cell_ID,c('in.glom', 'inside.glom','position.vs.glom', 'closest.glom')])
## B-cells
bcell_seurat <- CreateSeuratObject(
  counts = raw[c(b_cell_uncontam, 'HBB'),],
  project = "LN_spatial",
  assay = "nanostrRNA",
  meta.data = annot
)

### only B-cell annotation
bcell_seurat <- subset(bcell_seurat,
                       subset = clust %in% b_cell_types)

# Scale data
bcell_seurat@meta.data$log10totalcounts <- sapply(bcell_seurat@meta.data$nCount_nanostrRNA, log10)
bcell_seurat <- ScaleData(bcell_seurat, 
                          features = c(b_cell_uncontam, 'HBB'),
                          model.use = 'negbinom',
                          vars.to.regress = 'log10totalcounts')
Regressing out log10totalcounts

  |                                                                                                                        
  |                                                                                                                  |   0%
  |                                                                                                                        
  |=                                                                                                                 |   1%
  |                                                                                                                        
  |==                                                                                                                |   1%
  |                                                                                                                        
  |==                                                                                                                |   2%
  |                                                                                                                        
  |===                                                                                                               |   2%
  |                                                                                                                        
  |===                                                                                                               |   3%
  |                                                                                                                        
  |====                                                                                                              |   3%
  |                                                                                                                        
  |====                                                                                                              |   4%
  |                                                                                                                        
  |=====                                                                                                             |   4%
  |                                                                                                                        
  |=====                                                                                                             |   5%
  |                                                                                                                        
  |======                                                                                                            |   5%
  |                                                                                                                        
  |======                                                                                                            |   6%
  |                                                                                                                        
  |=======                                                                                                           |   6%
  |                                                                                                                        
  |=======                                                                                                           |   7%
  |                                                                                                                        
  |========                                                                                                          |   7%
  |                                                                                                                        
  |=========                                                                                                         |   8%
  |                                                                                                                        
  |==========                                                                                                        |   8%
  |                                                                                                                        
  |==========                                                                                                        |   9%
  |                                                                                                                        
  |===========                                                                                                       |   9%
  |                                                                                                                        
  |===========                                                                                                       |  10%
  |                                                                                                                        
  |============                                                                                                      |  10%
  |                                                                                                                        
  |============                                                                                                      |  11%
  |                                                                                                                        
  |=============                                                                                                     |  11%
  |                                                                                                                        
  |=============                                                                                                     |  12%
  |                                                                                                                        
  |==============                                                                                                    |  12%
  |                                                                                                                        
  |==============                                                                                                    |  13%
  |                                                                                                                        
  |===============                                                                                                   |  13%
  |                                                                                                                        
  |===============                                                                                                   |  14%
  |                                                                                                                        
  |================                                                                                                  |  14%
  |                                                                                                                        
  |=================                                                                                                 |  15%
  |                                                                                                                        
  |==================                                                                                                |  16%
  |                                                                                                                        
  |===================                                                                                               |  16%
  |                                                                                                                        
  |===================                                                                                               |  17%
  |                                                                                                                        
  |====================                                                                                              |  17%
  |                                                                                                                        
  |====================                                                                                              |  18%
  |                                                                                                                        
  |=====================                                                                                             |  18%
  |                                                                                                                        
  |=====================                                                                                             |  19%
  |                                                                                                                        
  |======================                                                                                            |  19%
  |                                                                                                                        
  |======================                                                                                            |  20%
  |                                                                                                                        
  |=======================                                                                                           |  20%
  |                                                                                                                        
  |========================                                                                                          |  21%
  |                                                                                                                        
  |=========================                                                                                         |  22%
  |                                                                                                                        
  |==========================                                                                                        |  22%
  |                                                                                                                        
  |==========================                                                                                        |  23%
  |                                                                                                                        
  |===========================                                                                                       |  23%
  |                                                                                                                        
  |===========================                                                                                       |  24%
  |                                                                                                                        
  |============================                                                                                      |  24%
  |                                                                                                                        
  |============================                                                                                      |  25%
  |                                                                                                                        
  |=============================                                                                                     |  25%
  |                                                                                                                        
  |=============================                                                                                     |  26%
  |                                                                                                                        
  |==============================                                                                                    |  26%
  |                                                                                                                        
  |==============================                                                                                    |  27%
  |                                                                                                                        
  |===============================                                                                                   |  27%
  |                                                                                                                        
  |================================                                                                                  |  28%
  |                                                                                                                        
  |=================================                                                                                 |  29%
  |                                                                                                                        
  |==================================                                                                                |  29%
  |                                                                                                                        
  |==================================                                                                                |  30%
  |                                                                                                                        
  |===================================                                                                               |  30%
  |                                                                                                                        
  |===================================                                                                               |  31%
  |                                                                                                                        
  |====================================                                                                              |  31%
  |                                                                                                                        
  |====================================                                                                              |  32%
  |                                                                                                                        
  |=====================================                                                                             |  32%
  |                                                                                                                        
  |=====================================                                                                             |  33%
  |                                                                                                                        
  |======================================                                                                            |  33%
  |                                                                                                                        
  |======================================                                                                            |  34%
  |                                                                                                                        
  |=======================================                                                                           |  34%
  |                                                                                                                        
  |=======================================                                                                           |  35%
  |                                                                                                                        
  |========================================                                                                          |  35%
  |                                                                                                                        
  |=========================================                                                                         |  36%
  |                                                                                                                        
  |==========================================                                                                        |  37%
  |                                                                                                                        
  |===========================================                                                                       |  37%
  |                                                                                                                        
  |===========================================                                                                       |  38%
  |                                                                                                                        
  |============================================                                                                      |  38%
  |                                                                                                                        
  |============================================                                                                      |  39%
  |                                                                                                                        
  |=============================================                                                                     |  39%
  |                                                                                                                        
  |=============================================                                                                     |  40%
  |                                                                                                                        
  |==============================================                                                                    |  40%
  |                                                                                                                        
  |==============================================                                                                    |  41%
  |                                                                                                                        
  |===============================================                                                                   |  41%
  |                                                                                                                        
  |===============================================                                                                   |  42%
  |                                                                                                                        
  |================================================                                                                  |  42%
  |                                                                                                                        
  |=================================================                                                                 |  43%
  |                                                                                                                        
  |==================================================                                                                |  44%
  |                                                                                                                        
  |===================================================                                                               |  44%
  |                                                                                                                        
  |===================================================                                                               |  45%
  |                                                                                                                        
  |====================================================                                                              |  45%
  |                                                                                                                        
  |====================================================                                                              |  46%
  |                                                                                                                        
  |=====================================================                                                             |  46%
  |                                                                                                                        
  |=====================================================                                                             |  47%
  |                                                                                                                        
  |======================================================                                                            |  47%
  |                                                                                                                        
  |======================================================                                                            |  48%
  |                                                                                                                        
  |=======================================================                                                           |  48%
  |                                                                                                                        
  |=======================================================                                                           |  49%
  |                                                                                                                        
  |========================================================                                                          |  49%
  |                                                                                                                        
  |========================================================                                                          |  50%
  |                                                                                                                        
  |=========================================================                                                         |  50%
  |                                                                                                                        
  |==========================================================                                                        |  50%
  |                                                                                                                        
  |==========================================================                                                        |  51%
  |                                                                                                                        
  |===========================================================                                                       |  51%
  |                                                                                                                        
  |===========================================================                                                       |  52%
  |                                                                                                                        
  |============================================================                                                      |  52%
  |                                                                                                                        
  |============================================================                                                      |  53%
  |                                                                                                                        
  |=============================================================                                                     |  53%
  |                                                                                                                        
  |=============================================================                                                     |  54%
  |                                                                                                                        
  |==============================================================                                                    |  54%
  |                                                                                                                        
  |==============================================================                                                    |  55%
  |                                                                                                                        
  |===============================================================                                                   |  55%
  |                                                                                                                        
  |===============================================================                                                   |  56%
  |                                                                                                                        
  |================================================================                                                  |  56%
  |                                                                                                                        
  |=================================================================                                                 |  57%
  |                                                                                                                        
  |==================================================================                                                |  58%
  |                                                                                                                        
  |===================================================================                                               |  58%
  |                                                                                                                        
  |===================================================================                                               |  59%
  |                                                                                                                        
  |====================================================================                                              |  59%
  |                                                                                                                        
  |====================================================================                                              |  60%
  |                                                                                                                        
  |=====================================================================                                             |  60%
  |                                                                                                                        
  |=====================================================================                                             |  61%
  |                                                                                                                        
  |======================================================================                                            |  61%
  |                                                                                                                        
  |======================================================================                                            |  62%
  |                                                                                                                        
  |=======================================================================                                           |  62%
  |                                                                                                                        
  |=======================================================================                                           |  63%
  |                                                                                                                        
  |========================================================================                                          |  63%
  |                                                                                                                        
  |=========================================================================                                         |  64%
  |                                                                                                                        
  |==========================================================================                                        |  65%
  |                                                                                                                        
  |===========================================================================                                       |  65%
  |                                                                                                                        
  |===========================================================================                                       |  66%
  |                                                                                                                        
  |============================================================================                                      |  66%
  |                                                                                                                        
  |============================================================================                                      |  67%
  |                                                                                                                        
  |=============================================================================                                     |  67%
  |                                                                                                                        
  |=============================================================================                                     |  68%
  |                                                                                                                        
  |==============================================================================                                    |  68%
  |                                                                                                                        
  |==============================================================================                                    |  69%
  |                                                                                                                        
  |===============================================================================                                   |  69%
  |                                                                                                                        
  |===============================================================================                                   |  70%
  |                                                                                                                        
  |================================================================================                                  |  70%
  |                                                                                                                        
  |================================================================================                                  |  71%
  |                                                                                                                        
  |=================================================================================                                 |  71%
  |                                                                                                                        
  |==================================================================================                                |  72%
  |                                                                                                                        
  |===================================================================================                               |  73%
  |                                                                                                                        
  |====================================================================================                              |  73%
  |                                                                                                                        
  |====================================================================================                              |  74%
  |                                                                                                                        
  |=====================================================================================                             |  74%
  |                                                                                                                        
  |=====================================================================================                             |  75%
  |                                                                                                                        
  |======================================================================================                            |  75%
  |                                                                                                                        
  |======================================================================================                            |  76%
  |                                                                                                                        
  |=======================================================================================                           |  76%
  |                                                                                                                        
  |=======================================================================================                           |  77%
  |                                                                                                                        
  |========================================================================================                          |  77%
  |                                                                                                                        
  |========================================================================================                          |  78%
  |                                                                                                                        
  |=========================================================================================                         |  78%
  |                                                                                                                        
  |==========================================================================================                        |  79%
  |                                                                                                                        
  |===========================================================================================                       |  80%
  |                                                                                                                        
  |============================================================================================                      |  80%
  |                                                                                                                        
  |============================================================================================                      |  81%
  |                                                                                                                        
  |=============================================================================================                     |  81%
  |                                                                                                                        
  |=============================================================================================                     |  82%
  |                                                                                                                        
  |==============================================================================================                    |  82%
  |                                                                                                                        
  |==============================================================================================                    |  83%
  |                                                                                                                        
  |===============================================================================================                   |  83%
  |                                                                                                                        
  |===============================================================================================                   |  84%
  |                                                                                                                        
  |================================================================================================                  |  84%
  |                                                                                                                        
  |=================================================================================================                 |  85%
  |                                                                                                                        
  |==================================================================================================                |  86%
  |                                                                                                                        
  |===================================================================================================               |  86%
  |                                                                                                                        
  |===================================================================================================               |  87%
  |                                                                                                                        
  |====================================================================================================              |  87%
  |                                                                                                                        
  |====================================================================================================              |  88%
  |                                                                                                                        
  |=====================================================================================================             |  88%
  |                                                                                                                        
  |=====================================================================================================             |  89%
  |                                                                                                                        
  |======================================================================================================            |  89%
  |                                                                                                                        
  |======================================================================================================            |  90%
  |                                                                                                                        
  |=======================================================================================================           |  90%
  |                                                                                                                        
  |=======================================================================================================           |  91%
  |                                                                                                                        
  |========================================================================================================          |  91%
  |                                                                                                                        
  |========================================================================================================          |  92%
  |                                                                                                                        
  |=========================================================================================================         |  92%
  |                                                                                                                        
  |==========================================================================================================        |  93%
  |                                                                                                                        
  |===========================================================================================================       |  93%
  |                                                                                                                        
  |===========================================================================================================       |  94%
  |                                                                                                                        
  |============================================================================================================      |  94%
  |                                                                                                                        
  |============================================================================================================      |  95%
  |                                                                                                                        
  |=============================================================================================================     |  95%
  |                                                                                                                        
  |=============================================================================================================     |  96%
  |                                                                                                                        
  |==============================================================================================================    |  96%
  |                                                                                                                        
  |==============================================================================================================    |  97%
  |                                                                                                                        
  |===============================================================================================================   |  97%
  |                                                                                                                        
  |===============================================================================================================   |  98%
  |                                                                                                                        
  |================================================================================================================  |  98%
  |                                                                                                                        
  |================================================================================================================  |  99%
  |                                                                                                                        
  |================================================================================================================= |  99%
  |                                                                                                                        
  |==================================================================================================================| 100%
Centering and scaling data matrix

  |                                                                                                                        
  |                                                                                                                  |   0%
  |                                                                                                                        
  |==================================================================================================================| 100%
## negative values in the Scale Data column correspond to 0 values in the expression data. Rather than let pseudocounts cause "negative gene expression", these values should be corrected to be zero
tru_val <- as.vector(bcell_seurat@assays$nanostrRNA@counts)
scaled <- as.vector(bcell_seurat@assays$nanostrRNA@scale.data)
toplot <- data.frame(counts = tru_val,
                     scaled = scaled)

ggplot(toplot, aes(x = counts, y = scaled)) + geom_point(alpha = 0.2, size = 0.2)


# Make all scaled values < 0 equal 0 
bcell_seurat@assays$nanostrRNA@scale.data[which(bcell_seurat@assays$nanostrRNA@scale.data < 0)] <- 0

# Filter HBB+ cells
## Dist
cells_in_data <- colnames(bcell_seurat)

tmp <- data.frame(cell_ID = cells_in_data,
                  HBB = bcell_seurat@assays$nanostrRNA@scale.data['HBB', cells_in_data],
                  HBA = bcell_seurat@assays$nanostrRNA@scale.data['HBA1', cells_in_data])

ggplot(tmp, aes(x = HBA, y = HBB)) + geom_point()


HB_cells <- tmp[which((tmp$HBA > 2.5) |
                        tmp$HBB > 2.5), 'cell_ID']
nonHB_cells <- tmp$cell_ID[which(!(tmp$cell_ID %in% HB_cells))]

### update annot to include rbcs
annot[which(annot$cell_ID %in% HB_cells),'basictype'] <- 'rbc'
annot[which(annot$cell_ID %in% HB_cells),'clust'] <- 'rbc'

### No HB cells
bcell_seurat <- subset(bcell_seurat,
                       subset = cell_ID %in% nonHB_cells)

### No hemoglobin gene expression
all_genes <- row.names(bcell_seurat)
bcell_seurat <- subset(bcell_seurat,
                       features = all_genes[which(!(all_genes %in% c('HBB', 'HBA1')))])
bcell_all.genes <- rownames(bcell_seurat)

# Run PCA
## B-cells
bcell_seurat <- RunPCA(bcell_seurat, features = bcell_all.genes, npcs=20)
PC_ 1 
Positive:  MARCO, MMP3, CCL7, CLEC4D, RSPO2, IL36G, FOXP3, MMP1, LY75, IFNG 
       PGF, CYP19A1, GPER1, ACKR1, IFNL3, NLRC4, IAPP, GDNF, EFNB3, ADGRV1 
       VPREB3, KRT6B, CD8B, S100A8, ADGRB3, TNFRSF11A, ADGRB2, INHBB, CD40LG, IL24 
Negative:  CD53, S100A4, IL16, PTGES2, SELENOP, IL17D, STAT5A, TNFRSF17, LAIR1, LIF 
       CD70, LGALS9, WIF1, WNT7B, RPL32, MPO, BTG1, CD52, EFNA4, HLA-DQB1 
       MTRNR2L1, KRT13, CCRL2, C1QB, TNFRSF9, CSK, RAC2, ARHGDIB, IL15RA, PSCA 
PC_ 2 
Positive:  KRT13, PSCA, LIF, EFNA4, IL17D, WNT7B, IL17A, TNFRSF9, CCRL2, PTGES2 
       TNFRSF17, STAT5A, CD70, MTRNR2L1, APOB, WIF1, MPO, LEP, TWIST2, KRT86 
       S100A4, LAIR1, CUZD1, KRT20, ADGRF4, RAD51, GDF3, CD53, IL20, LGALS9 
Negative:  XBP1, IFITM1, GPX1, MGP, COL3A1, IFI27, MZB1, C1QA, C1QC, CD81 
       TAGLN, CALD1, RPL34, HLA-DRB5, JCHAIN, IGKC, MALAT1, CD38, HSP90B1, COL1A1 
       BST2, CD163, CD27, IGHG2, TIMP1, HLA-DPA1, ITGB2, TYK2, IGHG1, SRGN 
PC_ 3 
Positive:  PROKR1, SERPINB5, ATF3, DNTT, VEGFC, TNFRSF13B, CXCR5, ACTG2, BMP6, CCL13 
       NLRP2, GDNF, NRIP3, CCL28, FGG, TCL1A, TNFSF13B, AATK, SLC2A4, MMP3 
       ADGRV1, COL9A3, TLR3, ACKR3, LINC02446, SAA2, WNT5B, EFNB3, THBS2, CCL7 
Negative:  KRT13, LIF, PTGES2, TNFRSF17, C1QB, CCRL2, STAT5A, TNFRSF9, S100A4, CD53 
       MTRNR2L1, MPO, EFNA4, WNT7B, IL17A, IL17D, SELENOP, LGALS9, CD70, LAIR1 
       WIF1, HLA-DQA1, C1QA, HLA-DPA1, C1QC, PSCA, CD163, ITGB2, HLA-DRB5, TIMP1 
PC_ 4 
Positive:  CCL5, GZMK, PTPRCAP, HLA-DQA1, FYB1, CD52, HLA-DPA1, HLA-DQB1, CD84, LYZ 
       CD2, CD37, NKG7, PRF1, PDCD1, ITGB2, NLRC5, CD3E, PTPRC, IL16 
       KLRK1, CD69, CST7, GZMH, ARHGDIB, IL2RG, BTG1, IL7R, GZMB, CASP8 
Negative:  MZB1, XBP1, TLR2, COL3A1, IGKC, CLEC4A, RPS4Y1, LPAR5, JCHAIN, MGP 
       PTGS2, IGHG2, SMARCB1, IGHG1, TNFAIP6, TAGLN, NRG4, NOD2, COL5A1, LUM 
       EPHB6, CSF1R, COL1A1, WNT5A, CD38, ANGPT2, BGN, HSP90B1, CALD1, TWIST1 
PC_ 5 
Positive:  FYN, CLEC4A, CSF1R, IL12RB1, RPS4Y1, NRG4, EPHB6, NOD2, CCL5, SMARCB1 
       CXCL17, GDF3, TLR2, IL20, CCL3, PLAC8, TWIST1, CTLA4, RAC2, ACKR3 
       COL15A1, FYB1, CD2, RGS1, IL7R, TNFAIP6, CLOCK, CXCR4, PTGIS, ANGPT2 
Negative:  TSLP, XBP1, MPO, MZB1, COL3A1, ADGRA3, IGHG1, PTGDR2, WNT7A, PDGFD 
       WNT9A, IGHG2, KRT13, COL1A1, COL1A2, WNT7B, FGF12, WIF1, DMBT1, VEGFC 
       TAGLN, TNFRSF17, MGP, TNFRSF9, IGKC, MMP1, COL5A2, UCP1, CD38, COL5A3 
ElbowPlot(bcell_seurat, ndims=20)

bcell_seurat <- RunUMAP(bcell_seurat, dims = 1:20)
Warning: The default method for RunUMAP has changed from calling Python UMAP via reticulate to the R-native UWOT using the cosine metric
To use Python UMAP via reticulate, set umap.method to 'umap-learn' and metric to 'correlation'
This message will be shown once per session
12:04:57 UMAP embedding parameters a = 0.9922 b = 1.112
12:04:57 Read 2897 rows and found 20 numeric columns
12:04:57 Using Annoy for neighbor search, n_neighbors = 30
12:04:57 Building Annoy index with metric = cosine, n_trees = 50
0%   10   20   30   40   50   60   70   80   90   100%
[----|----|----|----|----|----|----|----|----|----|
**************************************************|
12:04:58 Writing NN index file to temp file /tmp/RtmpbjSzLh/file4d5f3661fd7a4
12:04:58 Searching Annoy index using 1 thread, search_k = 3000
12:04:59 Annoy recall = 100%
12:04:59 Commencing smooth kNN distance calibration using 1 thread with target n_neighbors = 30
12:05:00 Initializing from normalized Laplacian + noise (using RSpectra)
12:05:00 Commencing optimization for 500 epochs, with 124806 positive edges
Using method 'umap'
0%   10   20   30   40   50   60   70   80   90   100%
[----|----|----|----|----|----|----|----|----|----|
**************************************************|
12:05:03 Optimization finished
# Run UMAP
## B-cells
bcell_seurat <- FindNeighbors(bcell_seurat, dims = 1:20)
Computing nearest neighbor graph
Computing SNN
bcell_seurat <- FindClusters(bcell_seurat, resolution = 1)
Modularity Optimizer version 1.3.0 by Ludo Waltman and Nees Jan van Eck

Number of nodes: 2897
Number of edges: 102784

Running Louvain algorithm...
0%   10   20   30   40   50   60   70   80   90   100%
[----|----|----|----|----|----|----|----|----|----|
**************************************************|
Maximum modularity in 10 random starts: 0.6515
Number of communities: 10
Elapsed time: 0 seconds
bcell_seurat <- AddMetaData(bcell_seurat,
                  data.frame(bcell_seurat@reductions$umap@cell.embeddings))

DimPlot(bcell_seurat, reduction = 'umap') + plot_annotation(title='B-cell PCA Clusters')

ggplot(bcell_seurat@meta.data,
       aes(x=UMAP_1, 
           y=UMAP_2,
           color=log10totalcounts)) +
  geom_point(size=0.5) +
  ggtitle('B-cell UMAP with RNA Counts')

NA
NA

Subcluster cells with MLE

Use MLEcell

# b cell subclustering
bcell_cols <- which(clust %in% b_cell_types)
bcell_cnts <- raw[b_cell_uncontam,bcell_cols]
bcell_negm <- annot[bcell_cols,'negmean']
bcell_coho <- fastCohorting(annot[bcell_cols, c('Area',
                                                'AspectRatio',
                                                'Mean.PanCK', 
                                                'Mean.CD45',
                                                'Mean.DAPI')],
                        gaussian_transform = TRUE) 
fitting ...

  |                                                                                                                        
  |                                                                                                                  |   0%
  |                                                                                                                        
  |=========================================================                                                         |  50%
  |                                                                                                                        
  |==================================================================================================================| 100%
bcell_unsup <- insitutype(counts = t(as.matrix(bcell_cnts)),
                          neg = bcell_negm,
                          cohort = bcell_coho,
                          bg = NULL, 
                    n_clusts = c(2, 4),
                    reference_profiles = NULL, # NULL value runs unsupervised clustering
                    ) 
1.1 cells per geometric bin.
Selecting optimal number of clusters from a range of 2 - 4
Clustering with n_clust = 2
iter 1
iter 2
iter 3
iter 4
iter 5
iter 6
Converged: <= 0.5% of cell type assignments changed in the last iteration.
==========================================================================
Clustering with n_clust = 4
iter 1
iter 2
iter 3
iter 4
iter 5
iter 6
iter 7
iter 8
iter 9
Converged: <= 0.5% of cell type assignments changed in the last iteration.
==========================================================================
phase 1: random starts in 3000 cell subsets
iter 1
iter 2
iter 3
iter 4
iter 5
iter 6
iter 7
iter 8
iter 9
iter 10
iter 11
iter 12
iter 13
iter 14
iter 15
iter 16
iter 17
iter 18
iter 19
iter 20
iter 21
iter 22
iter 23
Converged: <= 0.2% of cell type assignments changed in the last iteration.
==========================================================================
iter 1
iter 2
iter 3
iter 4
iter 5
iter 6
iter 7
iter 8
iter 9
iter 10
iter 11
Converged: <= 0.2% of cell type assignments changed in the last iteration.
==========================================================================
iter 1
iter 2
iter 3
iter 4
iter 5
iter 6
iter 7
iter 8
iter 9
iter 10
iter 11
iter 12
Converged: <= 0.2% of cell type assignments changed in the last iteration.
==========================================================================
iter 1
iter 2
iter 3
iter 4
iter 5
iter 6
iter 7
iter 8
iter 9
iter 10
iter 11
iter 12
iter 13
iter 14
iter 15
iter 16
Converged: <= 0.2% of cell type assignments changed in the last iteration.
==========================================================================
iter 1
iter 2
iter 3
iter 4
iter 5
iter 6
iter 7
iter 8
iter 9
iter 10
iter 11
iter 12
Converged: <= 0.2% of cell type assignments changed in the last iteration.
==========================================================================
iter 1
iter 2
iter 3
iter 4
iter 5
iter 6
iter 7
iter 8
iter 9
iter 10
iter 11
iter 12
iter 13
iter 14
iter 15
iter 16
iter 17
iter 18
iter 19
iter 20
iter 21
Converged: <= 0.2% of cell type assignments changed in the last iteration.
==========================================================================
iter 1
iter 2
iter 3
iter 4
iter 5
iter 6
iter 7
iter 8
iter 9
iter 10
iter 11
iter 12
Converged: <= 0.2% of cell type assignments changed in the last iteration.
==========================================================================
iter 1
iter 2
iter 3
iter 4
iter 5
iter 6
iter 7
iter 8
iter 9
iter 10
iter 11
iter 12
iter 13
iter 14
iter 15
iter 16
iter 17
iter 18
iter 19
iter 20
iter 21
Converged: <= 0.2% of cell type assignments changed in the last iteration.
==========================================================================
iter 1
iter 2
iter 3
iter 4
iter 5
iter 6
iter 7
iter 8
iter 9
iter 10
iter 11
Converged: <= 0.2% of cell type assignments changed in the last iteration.
==========================================================================
iter 1
iter 2
iter 3
iter 4
iter 5
iter 6
iter 7
iter 8
iter 9
iter 10
iter 11
Converged: <= 0.2% of cell type assignments changed in the last iteration.
==========================================================================
phase 2: refining best random start in a 3000 cell subset
iter 1
iter 2
iter 3
iter 4
Converged: <= 0.1% of cell type assignments changed in the last iteration.
==========================================================================
phase 3: finalizing clusters in a 3000 cell subset
iter 1
iter 2
Converged: <= 0.01% of cell type assignments changed in the last iteration.
==========================================================================
phase 4: classifying all 3000 cells

MLE heatmap

# B-cell heatmap
str(bcell_unsup)
List of 5
 $ clust                      : Named chr [1:3000] "d" "a" "d" "d" ...
  ..- attr(*, "names")= chr [1:3000] "c_1_13_59" "c_1_13_878" "c_1_13_1019" "c_1_13_1046" ...
 $ prob                       : Named num [1:3000] 1 1 1 0.999 1 ...
  ..- attr(*, "names")= chr [1:3000] "c_1_13_59" "c_1_13_878" "c_1_13_1019" "c_1_13_1046" ...
 $ profiles                   : num [1:502, 1:4] 0.0565 0.0141 0.1469 0.0381 0.1174 ...
  ..- attr(*, "dimnames")=List of 2
  .. ..$ : chr [1:502] "AATK" "ACKR1" "ACKR3" "ACTG2" ...
  .. ..$ : chr [1:4] "a" "b" "c" "d"
 $ logliks                    : num [1:3000, 1:4] -260 -140 -237 -225 -226 ...
  ..- attr(*, "dimnames")=List of 2
  .. ..$ : chr [1:3000] "c_1_13_59" "c_1_13_878" "c_1_13_1019" "c_1_13_1046" ...
  .. ..$ : chr [1:4] "a" "b" "c" "d"
 $ logliks_from_lost_celltypes: num[1:3000, 0 ] 
  ..- attr(*, "dimnames")=List of 2
  .. ..$ : chr [1:3000] "c_1_13_59" "c_1_13_878" "c_1_13_1019" "c_1_13_1046" ...
  .. ..$ : NULL
round(head(bcell_unsup$prob),2)
  c_1_13_59  c_1_13_878 c_1_13_1019 c_1_13_1046 c_1_13_1195 c_1_13_1411 
          1           1           1           1           1           1 
bcell_hm <- heatmap(sweep(bcell_unsup$profiles,
                          1,
                          pmax(apply(bcell_unsup$profiles, 1, max),
                               .2),
                          "/"),
                    scale = "none",
                    main = "B-cell Subcluster Mean Expression Profiles")

Flightpath plot

## B-cells
# define cluster colors:
cols <- c('#a6cee3','#1f78b4','#b2df8a','#33a02c')
cols <- cols[seq_along(unique(bcell_unsup$clust))]
names(cols) <- unique(bcell_unsup$clust)

# make the flightpath plot
fp <- flightpath_plot(flightpath_result = NULL, insitutype_result = bcell_unsup, col = cols[bcell_unsup$clust])
Saving flightpath_plot to: ./NBClust-Plots/2024-10-24_12-07-11-PDT-flightpath_plot.png
class(fp)
[1] "gg"     "ggplot"
print(fp)
ggsave(fp, file="figures/bcell_MLEcell_fp.png")
Cannot find directory ]8;;file:///data/hps/home/nhasl2/LN_SpatialTranscriptomics/2024-April_NewData/figuresfigures]8;;.
ℹ Would you like to create a new directory?

1: Yes
2: No

Enter an item from the menu, or 0 to exit
1
✔ Created directory: ]8;;file:///data/hps/home/nhasl2/LN_SpatialTranscriptomics/2024-April_NewData/figuresfigures]8;;.
Saving 7.29 x 4.5 in image

Compare MLEcell and UMAP

# B-cells
bcell_seurat <- AddMetaData(bcell_seurat, 
                            data.frame(bcell_unsup$clust))

# rename subcluster identity
new = c('B.4','B.1','B.3','B.2')
new = factor(new, levels = c('B.1', 'B.2', 'B.3', 'B.4'))
key = data.frame(old = letters[1:4],
                 new = new)

bcell_seurat@meta.data$bcell_subclust <- sapply(bcell_seurat@meta.data$bcell_unsup.clust,
                                                function(o) {
                                                  return(key[which(key$old == o),'new'])
                                                })

bcell_seurat@meta.data$bcell_subclust <- factor(bcell_seurat@meta.data$bcell_subclust)

bcellcols <- c('#66c2a5','#fc8d62','#8da0cb','#e78ac3')

ggplot(bcell_seurat@meta.data,
       aes(x=UMAP_1,y=UMAP_2,color=bcell_subclust)) +
  geom_point(size=1) +
  scale_color_manual(values = bcellcols)

ggsave('figures/bcell_MLEcell_subclusts_UMAPspace.png',
       height=5.5)
Saving 7.29 x 5.5 in image

saveRDS(bcell_seurat, 
        file = 'processed_data/bcell_seurat.RDS')

Pub UMAP plot

Determine reasonable count filter

lapply(seq(from = 1.5, to = 2.5, by =0.1), function(x) {
  print(x)
  
  # filter and rescale the data
  temp_seurat <- ScaleData(subset(bcell_seurat, subset = log10totalcounts > x), 
                          features = c(bcell_all.genes),
                          model.use = 'negbinom',
                          vars.to.regress = 'log10totalcounts')
  # Run PCA
  temp_seurat <- RunPCA(temp_seurat, features = bcell_all.genes, npcs=20)
  # Run UMAP
  temp_seurat <- RunUMAP(temp_seurat, dims = 1:20)
  # Plot
  Idents(object = temp_seurat) <- temp_seurat@meta.data$'bcell_unsup.clust' 
  DimPlot(temp_seurat,
          reduction = 'umap',
          ) + plot_annotation(title=paste0('B-cell Subclusters, log RNA count >', x))
})
[1] 1.5
Regressing out log10totalcounts

  |                                                                                                                        
  |                                                                                                                  |   0%
  |                                                                                                                        
  |=                                                                                                                 |   1%
  |                                                                                                                        
  |==                                                                                                                |   1%
  |                                                                                                                        
  |==                                                                                                                |   2%
  |                                                                                                                        
  |===                                                                                                               |   2%
  |                                                                                                                        
  |===                                                                                                               |   3%
  |                                                                                                                        
  |====                                                                                                              |   3%
  |                                                                                                                        
  |====                                                                                                              |   4%
  |                                                                                                                        
  |=====                                                                                                             |   4%
  |                                                                                                                        
  |=====                                                                                                             |   5%
  |                                                                                                                        
  |======                                                                                                            |   5%
  |                                                                                                                        
  |======                                                                                                            |   6%
  |                                                                                                                        
  |=======                                                                                                           |   6%
  |                                                                                                                        
  |========                                                                                                          |   7%
  |                                                                                                                        
  |=========                                                                                                         |   8%
  |                                                                                                                        
  |==========                                                                                                        |   8%
  |                                                                                                                        
  |==========                                                                                                        |   9%
  |                                                                                                                        
  |===========                                                                                                       |   9%
  |                                                                                                                        
  |===========                                                                                                       |  10%
  |                                                                                                                        
  |============                                                                                                      |  10%
  |                                                                                                                        
  |============                                                                                                      |  11%
  |                                                                                                                        
  |=============                                                                                                     |  11%
  |                                                                                                                        
  |=============                                                                                                     |  12%
  |                                                                                                                        
  |==============                                                                                                    |  12%
  |                                                                                                                        
  |==============                                                                                                    |  13%
  |                                                                                                                        
  |===============                                                                                                   |  13%
  |                                                                                                                        
  |===============                                                                                                   |  14%
  |                                                                                                                        
  |================                                                                                                  |  14%
  |                                                                                                                        
  |=================                                                                                                 |  15%
  |                                                                                                                        
  |==================                                                                                                |  15%
  |                                                                                                                        
  |==================                                                                                                |  16%
  |                                                                                                                        
  |===================                                                                                               |  16%
  |                                                                                                                        
  |===================                                                                                               |  17%
  |                                                                                                                        
  |====================                                                                                              |  17%
  |                                                                                                                        
  |====================                                                                                              |  18%
  |                                                                                                                        
  |=====================                                                                                             |  18%
  |                                                                                                                        
  |=====================                                                                                             |  19%
  |                                                                                                                        
  |======================                                                                                            |  19%
  |                                                                                                                        
  |======================                                                                                            |  20%
  |                                                                                                                        
  |=======================                                                                                           |  20%
  |                                                                                                                        
  |=======================                                                                                           |  21%
  |                                                                                                                        
  |========================                                                                                          |  21%
  |                                                                                                                        
  |=========================                                                                                         |  22%
  |                                                                                                                        
  |==========================                                                                                        |  23%
  |                                                                                                                        
  |===========================                                                                                       |  23%
  |                                                                                                                        
  |===========================                                                                                       |  24%
  |                                                                                                                        
  |============================                                                                                      |  24%
  |                                                                                                                        
  |============================                                                                                      |  25%
  |                                                                                                                        
  |=============================                                                                                     |  25%
  |                                                                                                                        
  |=============================                                                                                     |  26%
  |                                                                                                                        
  |==============================                                                                                    |  26%
  |                                                                                                                        
  |==============================                                                                                    |  27%
  |                                                                                                                        
  |===============================                                                                                   |  27%
  |                                                                                                                        
  |===============================                                                                                   |  28%
  |                                                                                                                        
  |================================                                                                                  |  28%
  |                                                                                                                        
  |=================================                                                                                 |  29%
  |                                                                                                                        
  |==================================                                                                                |  30%
  |                                                                                                                        
  |===================================                                                                               |  30%
  |                                                                                                                        
  |===================================                                                                               |  31%
  |                                                                                                                        
  |====================================                                                                              |  31%
  |                                                                                                                        
  |====================================                                                                              |  32%
  |                                                                                                                        
  |=====================================                                                                             |  32%
  |                                                                                                                        
  |=====================================                                                                             |  33%
  |                                                                                                                        
  |======================================                                                                            |  33%
  |                                                                                                                        
  |======================================                                                                            |  34%
  |                                                                                                                        
  |=======================================                                                                           |  34%
  |                                                                                                                        
  |=======================================                                                                           |  35%
  |                                                                                                                        
  |========================================                                                                          |  35%
  |                                                                                                                        
  |=========================================                                                                         |  36%
  |                                                                                                                        
  |==========================================                                                                        |  37%
  |                                                                                                                        
  |===========================================                                                                       |  37%
  |                                                                                                                        
  |===========================================                                                                       |  38%
  |                                                                                                                        
  |============================================                                                                      |  38%
  |                                                                                                                        
  |============================================                                                                      |  39%
  |                                                                                                                        
  |=============================================                                                                     |  39%
  |                                                                                                                        
  |=============================================                                                                     |  40%
  |                                                                                                                        
  |==============================================                                                                    |  40%
  |                                                                                                                        
  |==============================================                                                                    |  41%
  |                                                                                                                        
  |===============================================                                                                   |  41%
  |                                                                                                                        
  |===============================================                                                                   |  42%
  |                                                                                                                        
  |================================================                                                                  |  42%
  |                                                                                                                        
  |================================================                                                                  |  43%
  |                                                                                                                        
  |=================================================                                                                 |  43%
  |                                                                                                                        
  |==================================================                                                                |  44%
  |                                                                                                                        
  |===================================================                                                               |  44%
  |                                                                                                                        
  |===================================================                                                               |  45%
  |                                                                                                                        
  |====================================================                                                              |  45%
  |                                                                                                                        
  |====================================================                                                              |  46%
  |                                                                                                                        
  |=====================================================                                                             |  46%
  |                                                                                                                        
  |=====================================================                                                             |  47%
  |                                                                                                                        
  |======================================================                                                            |  47%
  |                                                                                                                        
  |======================================================                                                            |  48%
  |                                                                                                                        
  |=======================================================                                                           |  48%
  |                                                                                                                        
  |=======================================================                                                           |  49%
  |                                                                                                                        
  |========================================================                                                          |  49%
  |                                                                                                                        
  |========================================================                                                          |  50%
  |                                                                                                                        
  |=========================================================                                                         |  50%
  |                                                                                                                        
  |==========================================================                                                        |  50%
  |                                                                                                                        
  |==========================================================                                                        |  51%
  |                                                                                                                        
  |===========================================================                                                       |  51%
  |                                                                                                                        
  |===========================================================                                                       |  52%
  |                                                                                                                        
  |============================================================                                                      |  52%
  |                                                                                                                        
  |============================================================                                                      |  53%
  |                                                                                                                        
  |=============================================================                                                     |  53%
  |                                                                                                                        
  |=============================================================                                                     |  54%
  |                                                                                                                        
  |==============================================================                                                    |  54%
  |                                                                                                                        
  |==============================================================                                                    |  55%
  |                                                                                                                        
  |===============================================================                                                   |  55%
  |                                                                                                                        
  |===============================================================                                                   |  56%
  |                                                                                                                        
  |================================================================                                                  |  56%
  |                                                                                                                        
  |=================================================================                                                 |  57%
  |                                                                                                                        
  |==================================================================                                                |  57%
  |                                                                                                                        
  |==================================================================                                                |  58%
  |                                                                                                                        
  |===================================================================                                               |  58%
  |                                                                                                                        
  |===================================================================                                               |  59%
  |                                                                                                                        
  |====================================================================                                              |  59%
  |                                                                                                                        
  |====================================================================                                              |  60%
  |                                                                                                                        
  |=====================================================================                                             |  60%
  |                                                                                                                        
  |=====================================================================                                             |  61%
  |                                                                                                                        
  |======================================================================                                            |  61%
  |                                                                                                                        
  |======================================================================                                            |  62%
  |                                                                                                                        
  |=======================================================================                                           |  62%
  |                                                                                                                        
  |=======================================================================                                           |  63%
  |                                                                                                                        
  |========================================================================                                          |  63%
  |                                                                                                                        
  |=========================================================================                                         |  64%
  |                                                                                                                        
  |==========================================================================                                        |  65%
  |                                                                                                                        
  |===========================================================================                                       |  65%
  |                                                                                                                        
  |===========================================================================                                       |  66%
  |                                                                                                                        
  |============================================================================                                      |  66%
  |                                                                                                                        
  |============================================================================                                      |  67%
  |                                                                                                                        
  |=============================================================================                                     |  67%
  |                                                                                                                        
  |=============================================================================                                     |  68%
  |                                                                                                                        
  |==============================================================================                                    |  68%
  |                                                                                                                        
  |==============================================================================                                    |  69%
  |                                                                                                                        
  |===============================================================================                                   |  69%
  |                                                                                                                        
  |===============================================================================                                   |  70%
  |                                                                                                                        
  |================================================================================                                  |  70%
  |                                                                                                                        
  |=================================================================================                                 |  71%
  |                                                                                                                        
  |==================================================================================                                |  72%
  |                                                                                                                        
  |===================================================================================                               |  72%
  |                                                                                                                        
  |===================================================================================                               |  73%
  |                                                                                                                        
  |====================================================================================                              |  73%
  |                                                                                                                        
  |====================================================================================                              |  74%
  |                                                                                                                        
  |=====================================================================================                             |  74%
  |                                                                                                                        
  |=====================================================================================                             |  75%
  |                                                                                                                        
  |======================================================================================                            |  75%
  |                                                                                                                        
  |======================================================================================                            |  76%
  |                                                                                                                        
  |=======================================================================================                           |  76%
  |                                                                                                                        
  |=======================================================================================                           |  77%
  |                                                                                                                        
  |========================================================================================                          |  77%
  |                                                                                                                        
  |=========================================================================================                         |  78%
  |                                                                                                                        
  |==========================================================================================                        |  79%
  |                                                                                                                        
  |===========================================================================================                       |  79%
  |                                                                                                                        
  |===========================================================================================                       |  80%
  |                                                                                                                        
  |============================================================================================                      |  80%
  |                                                                                                                        
  |============================================================================================                      |  81%
  |                                                                                                                        
  |=============================================================================================                     |  81%
  |                                                                                                                        
  |=============================================================================================                     |  82%
  |                                                                                                                        
  |==============================================================================================                    |  82%
  |                                                                                                                        
  |==============================================================================================                    |  83%
  |                                                                                                                        
  |===============================================================================================                   |  83%
  |                                                                                                                        
  |===============================================================================================                   |  84%
  |                                                                                                                        
  |================================================================================================                  |  84%
  |                                                                                                                        
  |================================================================================================                  |  85%
  |                                                                                                                        
  |=================================================================================================                 |  85%
  |                                                                                                                        
  |==================================================================================================                |  86%
  |                                                                                                                        
  |===================================================================================================               |  86%
  |                                                                                                                        
  |===================================================================================================               |  87%
  |                                                                                                                        
  |====================================================================================================              |  87%
  |                                                                                                                        
  |====================================================================================================              |  88%
  |                                                                                                                        
  |=====================================================================================================             |  88%
  |                                                                                                                        
  |=====================================================================================================             |  89%
  |                                                                                                                        
  |======================================================================================================            |  89%
  |                                                                                                                        
  |======================================================================================================            |  90%
  |                                                                                                                        
  |=======================================================================================================           |  90%
  |                                                                                                                        
  |=======================================================================================================           |  91%
  |                                                                                                                        
  |========================================================================================================          |  91%
  |                                                                                                                        
  |========================================================================================================          |  92%
  |                                                                                                                        
  |=========================================================================================================         |  92%
  |                                                                                                                        
  |==========================================================================================================        |  93%
  |                                                                                                                        
  |===========================================================================================================       |  94%
  |                                                                                                                        
  |============================================================================================================      |  94%
  |                                                                                                                        
  |============================================================================================================      |  95%
  |                                                                                                                        
  |=============================================================================================================     |  95%
  |                                                                                                                        
  |=============================================================================================================     |  96%
  |                                                                                                                        
  |==============================================================================================================    |  96%
  |                                                                                                                        
  |==============================================================================================================    |  97%
  |                                                                                                                        
  |===============================================================================================================   |  97%
  |                                                                                                                        
  |===============================================================================================================   |  98%
  |                                                                                                                        
  |================================================================================================================  |  98%
  |                                                                                                                        
  |================================================================================================================  |  99%
  |                                                                                                                        
  |================================================================================================================= |  99%
  |                                                                                                                        
  |==================================================================================================================| 100%
Centering and scaling data matrix

  |                                                                                                                        
  |                                                                                                                  |   0%
  |                                                                                                                        
  |==================================================================================================================| 100%
PC_ 1 
Positive:  IGHG2, IGKC, IGHG1, XBP1, MALAT1, MZB1, MZT2A, TYK2, MGP, IFITM1 
       COL3A1, HSP90B1, JCHAIN, GPX1, CALD1, C1QA, CD38, CD81, IFI27, TAGLN 
       RPL34, C1QC, COL1A1, IGHA1, FKBP11, CD27, BST2, TIMP1, HLA-DRB5, IRF4 
Negative:  PSCA, IL17D, EFNA4, LIF, WNT7B, KRT13, STAT5A, TNFRSF9, CD70, PTGES2 
       TNFRSF17, IL17A, CCRL2, MTRNR2L1, APOB, WIF1, LEP, CD53, TWIST2, S100A4 
       CUZD1, RAD51, TCL1A, KRT20, KRT86, RARG, SLC2A4, WNT9A, LGALS9, CLEC4A 
PC_ 2 
Positive:  KRT13, LIF, PTGES2, CCRL2, MPO, TNFRSF17, TNFRSF9, IL17A, STAT5A, MTRNR2L1 
       EFNA4, IL17D, WNT7B, LAIR1, WIF1, CD70, IGHG1, S100A4, PSCA, SELENOP 
       C1QB, IGHG2, CD53, LGALS9, IGKC, APOB, KRT86, MKI67, ELANE, MZB1 
Negative:  PTPRCAP, CXCR5, CD37, HLA-DQB1, CD69, TNFSF13B, KRT15, IL2RG, CXCR4, PTPRC 
       IL2RB, TNFSF12, HLA-DRB5, CD48, MZT2A, TNFRSF13B, ARHGDIB, MRC1, CD44, RUNX3 
       CSK, LYZ, GPR183, ACTG2, VEGFC, JAK2, FES, LINC02446, OASL, GZMH 
PC_ 3 
Positive:  HLA-DPA1, HLA-DQA1, C1QB, HLA-DRB5, C1QA, HLA-DQB1, C1QC, ITGB2, CCL5, CD53 
       LYZ, S100A4, FYB1, CD163, CD68, CD52, KRT13, CD37, IL16, STAT5A 
       CD2, LGALS9, PTPRCAP, NLRC5, LIF, PTGES2, CD3E, MALAT1, PTPRC, GPX1 
Negative:  MZB1, XBP1, IGHG2, IGHG1, LPAR5, IGKC, TNFAIP6, RPS4Y1, TLR2, WNT5A 
       JCHAIN, SMARCB1, COL3A1, CD38, PLA2R1, CLEC4A, PTGS2, ADGRV1, COL5A1, DNTT 
       MGP, TAGLN, CSF2, COL1A1, ATF3, IRF4, AGR2, TSLP, FKBP11, HSP90B1 
PC_ 4 
Positive:  WNT7A, PTGDR2, VEGFC, TSLP, IGHG1, ADGRA3, WNT9A, IGHG2, CXCR5, WIF1 
       IL12A, KRT13, WNT7B, FGF12, DMBT1, FGG, TNFRSF9, SERPINB5, GZMH, FZD6 
       MMP1, TNFRSF13B, CD5L, ADGRG5, NRIP3, ATF3, MPO, TNFRSF17, IL17D, XCL2 
Negative:  CSF1R, CLEC4A, TLR2, RPS4Y1, FYN, NOD2, IL12RB1, NRG4, SMARCB1, EPHB6 
       CXCL17, TWIST1, CCL3, IL20, GDF3, COL15A1, PTGS2, RAC2, PLAC8, TNFAIP6 
       CLOCK, CTLA4, ANGPT2, IL15RA, ACKR3, PTGIS, WNT5A, NANOG, AZU1, RGS1 
PC_ 5 
Positive:  TAGLN, COL3A1, MGP, COL1A1, LUM, COL1A2, DCN, C1QC, COL6A2, C1QA 
       TIMP1, CD81, MMP2, C1QB, CALD1, SELENOP, CD163, CXCL12, BGN, COL6A3 
       PDGFRA, CD68, HGF, SLC40A1, SNAI2, MS4A4A, CYP1B1, IGFBP6, GPX1, MRC2 
Negative:  MZB1, MZT2A, MALAT1, CD27, XBP1, CD38, FKBP11, CCL5, IL2RG, DUSP5 
       FYN, CD3E, IRF4, JCHAIN, ST6GAL1, IGHG2, KLF2, HSP90B1, CD8A, NLRC5 
       CST7, CD52, IGHA1, CD79A, ITGAL, DUSP2, RAC2, GAS6, CSF2RB, GZMA 
12:08:03 UMAP embedding parameters a = 0.9922 b = 1.112
12:08:03 Read 2724 rows and found 20 numeric columns
12:08:03 Using Annoy for neighbor search, n_neighbors = 30
12:08:03 Building Annoy index with metric = cosine, n_trees = 50
0%   10   20   30   40   50   60   70   80   90   100%
[----|----|----|----|----|----|----|----|----|----|
**************************************************|
12:08:03 Writing NN index file to temp file /tmp/RtmpbjSzLh/file4d5f33b060159
12:08:03 Searching Annoy index using 1 thread, search_k = 3000
12:08:04 Annoy recall = 100%
12:08:04 Commencing smooth kNN distance calibration using 1 thread with target n_neighbors = 30
12:08:05 Initializing from normalized Laplacian + noise (using RSpectra)
12:08:05 Commencing optimization for 500 epochs, with 111790 positive edges
Using method 'umap'
0%   10   20   30   40   50   60   70   80   90   100%
[----|----|----|----|----|----|----|----|----|----|
**************************************************|
12:08:08 Optimization finished
[1] 1.6
Regressing out log10totalcounts

  |                                                                                                                        
  |                                                                                                                  |   0%
  |                                                                                                                        
  |=                                                                                                                 |   1%
  |                                                                                                                        
  |==                                                                                                                |   1%
  |                                                                                                                        
  |==                                                                                                                |   2%
  |                                                                                                                        
  |===                                                                                                               |   2%
  |                                                                                                                        
  |===                                                                                                               |   3%
  |                                                                                                                        
  |====                                                                                                              |   3%
  |                                                                                                                        
  |====                                                                                                              |   4%
  |                                                                                                                        
  |=====                                                                                                             |   4%
  |                                                                                                                        
  |=====                                                                                                             |   5%
  |                                                                                                                        
  |======                                                                                                            |   5%
  |                                                                                                                        
  |======                                                                                                            |   6%
  |                                                                                                                        
  |=======                                                                                                           |   6%
  |                                                                                                                        
  |========                                                                                                          |   7%
  |                                                                                                                        
  |=========                                                                                                         |   8%
  |                                                                                                                        
  |==========                                                                                                        |   8%
  |                                                                                                                        
  |==========                                                                                                        |   9%
  |                                                                                                                        
  |===========                                                                                                       |   9%
  |                                                                                                                        
  |===========                                                                                                       |  10%
  |                                                                                                                        
  |============                                                                                                      |  10%
  |                                                                                                                        
  |============                                                                                                      |  11%
  |                                                                                                                        
  |=============                                                                                                     |  11%
  |                                                                                                                        
  |=============                                                                                                     |  12%
  |                                                                                                                        
  |==============                                                                                                    |  12%
  |                                                                                                                        
  |==============                                                                                                    |  13%
  |                                                                                                                        
  |===============                                                                                                   |  13%
  |                                                                                                                        
  |===============                                                                                                   |  14%
  |                                                                                                                        
  |================                                                                                                  |  14%
  |                                                                                                                        
  |=================                                                                                                 |  15%
  |                                                                                                                        
  |==================                                                                                                |  15%
  |                                                                                                                        
  |==================                                                                                                |  16%
  |                                                                                                                        
  |===================                                                                                               |  16%
  |                                                                                                                        
  |===================                                                                                               |  17%
  |                                                                                                                        
  |====================                                                                                              |  17%
  |                                                                                                                        
  |====================                                                                                              |  18%
  |                                                                                                                        
  |=====================                                                                                             |  18%
  |                                                                                                                        
  |=====================                                                                                             |  19%
  |                                                                                                                        
  |======================                                                                                            |  19%
  |                                                                                                                        
  |======================                                                                                            |  20%
  |                                                                                                                        
  |=======================                                                                                           |  20%
  |                                                                                                                        
  |=======================                                                                                           |  21%
  |                                                                                                                        
  |========================                                                                                          |  21%
  |                                                                                                                        
  |=========================                                                                                         |  22%
  |                                                                                                                        
  |==========================                                                                                        |  23%
  |                                                                                                                        
  |===========================                                                                                       |  23%
  |                                                                                                                        
  |===========================                                                                                       |  24%
  |                                                                                                                        
  |============================                                                                                      |  24%
  |                                                                                                                        
  |============================                                                                                      |  25%
  |                                                                                                                        
  |=============================                                                                                     |  25%
  |                                                                                                                        
  |=============================                                                                                     |  26%
  |                                                                                                                        
  |==============================                                                                                    |  26%
  |                                                                                                                        
  |==============================                                                                                    |  27%
  |                                                                                                                        
  |===============================                                                                                   |  27%
  |                                                                                                                        
  |===============================                                                                                   |  28%
  |                                                                                                                        
  |================================                                                                                  |  28%
  |                                                                                                                        
  |=================================                                                                                 |  29%
  |                                                                                                                        
  |==================================                                                                                |  30%
  |                                                                                                                        
  |===================================                                                                               |  30%
  |                                                                                                                        
  |===================================                                                                               |  31%
  |                                                                                                                        
  |====================================                                                                              |  31%
  |                                                                                                                        
  |====================================                                                                              |  32%
  |                                                                                                                        
  |=====================================                                                                             |  32%
  |                                                                                                                        
  |=====================================                                                                             |  33%
  |                                                                                                                        
  |======================================                                                                            |  33%
  |                                                                                                                        
  |======================================                                                                            |  34%
  |                                                                                                                        
  |=======================================                                                                           |  34%
  |                                                                                                                        
  |=======================================                                                                           |  35%
  |                                                                                                                        
  |========================================                                                                          |  35%
  |                                                                                                                        
  |=========================================                                                                         |  36%
  |                                                                                                                        
  |==========================================                                                                        |  37%
  |                                                                                                                        
  |===========================================                                                                       |  37%
  |                                                                                                                        
  |===========================================                                                                       |  38%
  |                                                                                                                        
  |============================================                                                                      |  38%
  |                                                                                                                        
  |============================================                                                                      |  39%
  |                                                                                                                        
  |=============================================                                                                     |  39%
  |                                                                                                                        
  |=============================================                                                                     |  40%
  |                                                                                                                        
  |==============================================                                                                    |  40%
  |                                                                                                                        
  |==============================================                                                                    |  41%
  |                                                                                                                        
  |===============================================                                                                   |  41%
  |                                                                                                                        
  |===============================================                                                                   |  42%
  |                                                                                                                        
  |================================================                                                                  |  42%
  |                                                                                                                        
  |================================================                                                                  |  43%
  |                                                                                                                        
  |=================================================                                                                 |  43%
  |                                                                                                                        
  |==================================================                                                                |  44%
  |                                                                                                                        
  |===================================================                                                               |  44%
  |                                                                                                                        
  |===================================================                                                               |  45%
  |                                                                                                                        
  |====================================================                                                              |  45%
  |                                                                                                                        
  |====================================================                                                              |  46%
  |                                                                                                                        
  |=====================================================                                                             |  46%
  |                                                                                                                        
  |=====================================================                                                             |  47%
  |                                                                                                                        
  |======================================================                                                            |  47%
  |                                                                                                                        
  |======================================================                                                            |  48%
  |                                                                                                                        
  |=======================================================                                                           |  48%
  |                                                                                                                        
  |=======================================================                                                           |  49%
  |                                                                                                                        
  |========================================================                                                          |  49%
  |                                                                                                                        
  |========================================================                                                          |  50%
  |                                                                                                                        
  |=========================================================                                                         |  50%
  |                                                                                                                        
  |==========================================================                                                        |  50%
  |                                                                                                                        
  |==========================================================                                                        |  51%
  |                                                                                                                        
  |===========================================================                                                       |  51%
  |                                                                                                                        
  |===========================================================                                                       |  52%
  |                                                                                                                        
  |============================================================                                                      |  52%
  |                                                                                                                        
  |============================================================                                                      |  53%
  |                                                                                                                        
  |=============================================================                                                     |  53%
  |                                                                                                                        
  |=============================================================                                                     |  54%
  |                                                                                                                        
  |==============================================================                                                    |  54%
  |                                                                                                                        
  |==============================================================                                                    |  55%
  |                                                                                                                        
  |===============================================================                                                   |  55%
  |                                                                                                                        
  |===============================================================                                                   |  56%
  |                                                                                                                        
  |================================================================                                                  |  56%
  |                                                                                                                        
  |=================================================================                                                 |  57%
  |                                                                                                                        
  |==================================================================                                                |  57%
  |                                                                                                                        
  |==================================================================                                                |  58%
  |                                                                                                                        
  |===================================================================                                               |  58%
  |                                                                                                                        
  |===================================================================                                               |  59%
  |                                                                                                                        
  |====================================================================                                              |  59%
  |                                                                                                                        
  |====================================================================                                              |  60%
  |                                                                                                                        
  |=====================================================================                                             |  60%
  |                                                                                                                        
  |=====================================================================                                             |  61%
  |                                                                                                                        
  |======================================================================                                            |  61%
  |                                                                                                                        
  |======================================================================                                            |  62%
  |                                                                                                                        
  |=======================================================================                                           |  62%
  |                                                                                                                        
  |=======================================================================                                           |  63%
  |                                                                                                                        
  |========================================================================                                          |  63%
  |                                                                                                                        
  |=========================================================================                                         |  64%
  |                                                                                                                        
  |==========================================================================                                        |  65%
  |                                                                                                                        
  |===========================================================================                                       |  65%
  |                                                                                                                        
  |===========================================================================                                       |  66%
  |                                                                                                                        
  |============================================================================                                      |  66%
  |                                                                                                                        
  |============================================================================                                      |  67%
  |                                                                                                                        
  |=============================================================================                                     |  67%
  |                                                                                                                        
  |=============================================================================                                     |  68%
  |                                                                                                                        
  |==============================================================================                                    |  68%
  |                                                                                                                        
  |==============================================================================                                    |  69%
  |                                                                                                                        
  |===============================================================================                                   |  69%
  |                                                                                                                        
  |===============================================================================                                   |  70%
  |                                                                                                                        
  |================================================================================                                  |  70%
  |                                                                                                                        
  |=================================================================================                                 |  71%
  |                                                                                                                        
  |==================================================================================                                |  72%
  |                                                                                                                        
  |===================================================================================                               |  72%
  |                                                                                                                        
  |===================================================================================                               |  73%
  |                                                                                                                        
  |====================================================================================                              |  73%
  |                                                                                                                        
  |====================================================================================                              |  74%
  |                                                                                                                        
  |=====================================================================================                             |  74%
  |                                                                                                                        
  |=====================================================================================                             |  75%
  |                                                                                                                        
  |======================================================================================                            |  75%
  |                                                                                                                        
  |======================================================================================                            |  76%
  |                                                                                                                        
  |=======================================================================================                           |  76%
  |                                                                                                                        
  |=======================================================================================                           |  77%
  |                                                                                                                        
  |========================================================================================                          |  77%
  |                                                                                                                        
  |=========================================================================================                         |  78%
  |                                                                                                                        
  |==========================================================================================                        |  79%
  |                                                                                                                        
  |===========================================================================================                       |  79%
  |                                                                                                                        
  |===========================================================================================                       |  80%
  |                                                                                                                        
  |============================================================================================                      |  80%
  |                                                                                                                        
  |============================================================================================                      |  81%
  |                                                                                                                        
  |=============================================================================================                     |  81%
  |                                                                                                                        
  |=============================================================================================                     |  82%
  |                                                                                                                        
  |==============================================================================================                    |  82%
  |                                                                                                                        
  |==============================================================================================                    |  83%
  |                                                                                                                        
  |===============================================================================================                   |  83%
  |                                                                                                                        
  |===============================================================================================                   |  84%
  |                                                                                                                        
  |================================================================================================                  |  84%
  |                                                                                                                        
  |================================================================================================                  |  85%
  |                                                                                                                        
  |=================================================================================================                 |  85%
  |                                                                                                                        
  |==================================================================================================                |  86%
  |                                                                                                                        
  |===================================================================================================               |  86%
  |                                                                                                                        
  |===================================================================================================               |  87%
  |                                                                                                                        
  |====================================================================================================              |  87%
  |                                                                                                                        
  |====================================================================================================              |  88%
  |                                                                                                                        
  |=====================================================================================================             |  88%
  |                                                                                                                        
  |=====================================================================================================             |  89%
  |                                                                                                                        
  |======================================================================================================            |  89%
  |                                                                                                                        
  |======================================================================================================            |  90%
  |                                                                                                                        
  |=======================================================================================================           |  90%
  |                                                                                                                        
  |=======================================================================================================           |  91%
  |                                                                                                                        
  |========================================================================================================          |  91%
  |                                                                                                                        
  |========================================================================================================          |  92%
  |                                                                                                                        
  |=========================================================================================================         |  92%
  |                                                                                                                        
  |==========================================================================================================        |  93%
  |                                                                                                                        
  |===========================================================================================================       |  94%
  |                                                                                                                        
  |============================================================================================================      |  94%
  |                                                                                                                        
  |============================================================================================================      |  95%
  |                                                                                                                        
  |=============================================================================================================     |  95%
  |                                                                                                                        
  |=============================================================================================================     |  96%
  |                                                                                                                        
  |==============================================================================================================    |  96%
  |                                                                                                                        
  |==============================================================================================================    |  97%
  |                                                                                                                        
  |===============================================================================================================   |  97%
  |                                                                                                                        
  |===============================================================================================================   |  98%
  |                                                                                                                        
  |================================================================================================================  |  98%
  |                                                                                                                        
  |================================================================================================================  |  99%
  |                                                                                                                        
  |================================================================================================================= |  99%
  |                                                                                                                        
  |==================================================================================================================| 100%
Centering and scaling data matrix

  |                                                                                                                        
  |                                                                                                                  |   0%
  |                                                                                                                        
  |==================================================================================================================| 100%
PC_ 1 
Positive:  IGHG2, IGKC, IGHG1, MALAT1, XBP1, MZB1, MZT2A, TYK2, MGP, IFITM1 
       COL3A1, HSP90B1, JCHAIN, GPX1, CALD1, CD38, C1QA, CD81, IFI27, TAGLN 
       RPL34, C1QC, COL1A1, IGHA1, FKBP11, CD27, BST2, TIMP1, HLA-DRB5, IRF4 
Negative:  PSCA, IL17D, EFNA4, LIF, WNT7B, KRT13, STAT5A, CD70, TNFRSF9, PTGES2 
       TNFRSF17, IL17A, CCRL2, MTRNR2L1, APOB, CD53, LEP, WIF1, TWIST2, S100A4 
       CUZD1, RAD51, KRT20, KRT86, TCL1A, SLC2A4, RARG, LGALS9, CLEC4A, WNT9A 
PC_ 2 
Positive:  LIF, KRT13, MPO, PTGES2, CCRL2, TNFRSF17, TNFRSF9, IL17A, MTRNR2L1, STAT5A 
       EFNA4, IL17D, LAIR1, WNT7B, IGHG1, WIF1, CD70, PSCA, S100A4, IGHG2 
       SELENOP, C1QB, CD53, IGKC, LGALS9, APOB, KRT86, MZB1, ELANE, MKI67 
Negative:  PTPRCAP, CXCR5, HLA-DQB1, CD37, CD69, KRT15, PTPRC, IL2RG, HLA-DRB5, CXCR4 
       IL2RB, TNFSF13B, TNFSF12, MZT2A, CD48, CD44, ARHGDIB, LYZ, TNFRSF13B, BTG1 
       MRC1, GPR183, RUNX3, FES, CSK, VEGFC, NLRC5, ACTG2, OASL, SELL 
PC_ 3 
Positive:  MZB1, XBP1, IGHG2, LPAR5, IGHG1, IGKC, TNFAIP6, RPS4Y1, TLR2, WNT5A 
       JCHAIN, SMARCB1, PLA2R1, CD38, COL3A1, PTGS2, CLEC4A, ADGRV1, DNTT, ATF3 
       AGR2, TAGLN, COL5A1, CSF2, MGP, IRF4, PROKR1, FKBP11, CLOCK, HSP90B1 
Negative:  HLA-DPA1, HLA-DQA1, C1QB, HLA-DRB5, C1QA, HLA-DQB1, C1QC, ITGB2, CCL5, CD53 
       LYZ, S100A4, CD163, FYB1, CD68, KRT13, CD52, STAT5A, LIF, IL16 
       CD37, LGALS9, PTGES2, CD2, NLRC5, PTPRCAP, CD3E, MALAT1, CCRL2, EFNA4 
PC_ 4 
Positive:  WNT7A, PTGDR2, VEGFC, IGHG1, TSLP, ADGRA3, WNT9A, IGHG2, CXCR5, KRT13 
       WIF1, WNT7B, IL12A, FGF12, GZMH, FZD6, MMP1, FGG, CD5L, TNFRSF9 
       TNFRSF13B, DMBT1, SERPINB5, NRIP3, ADGRG5, ATF3, TNFRSF17, WNT5B, MPO, XCL2 
Negative:  CSF1R, CLEC4A, TLR2, RPS4Y1, FYN, NOD2, IL12RB1, NRG4, SMARCB1, EPHB6 
       CXCL17, TWIST1, CCL3, IL20, GDF3, COL15A1, PTGS2, PLAC8, RAC2, TNFAIP6 
       CLOCK, CTLA4, ANGPT2, IL15RA, PTGIS, ACKR3, NANOG, WNT5A, AZU1, RGS1 
PC_ 5 
Positive:  TAGLN, COL3A1, COL1A1, MGP, LUM, COL1A2, DCN, C1QC, COL6A2, C1QA 
       TIMP1, CD81, MMP2, CALD1, C1QB, CXCL12, SELENOP, CD163, BGN, COL6A3 
       PDGFRA, CD68, HGF, SLC40A1, SNAI2, MS4A4A, IGFBP6, CYP1B1, MRC2, GPX1 
Negative:  MZB1, MZT2A, MALAT1, CD27, XBP1, CD38, CCL5, FKBP11, IL2RG, FYN 
       DUSP5, CD3E, IRF4, JCHAIN, ST6GAL1, IGHG2, CD8A, KLF2, NLRC5, RAC2 
       HSP90B1, CST7, CD79A, DUSP2, CSF2RB, ITGAL, IGHA1, GAS6, CD52, CCR5 
12:08:42 UMAP embedding parameters a = 0.9922 b = 1.112
12:08:42 Read 2606 rows and found 20 numeric columns
12:08:42 Using Annoy for neighbor search, n_neighbors = 30
12:08:42 Building Annoy index with metric = cosine, n_trees = 50
0%   10   20   30   40   50   60   70   80   90   100%
[----|----|----|----|----|----|----|----|----|----|
**************************************************|
12:08:42 Writing NN index file to temp file /tmp/RtmpbjSzLh/file4d5f36f4fec5
12:08:42 Searching Annoy index using 1 thread, search_k = 3000
12:08:42 Annoy recall = 100%
12:08:43 Commencing smooth kNN distance calibration using 1 thread with target n_neighbors = 30
12:08:44 Initializing from normalized Laplacian + noise (using RSpectra)
12:08:44 Commencing optimization for 500 epochs, with 106558 positive edges
Using method 'umap'
0%   10   20   30   40   50   60   70   80   90   100%
[----|----|----|----|----|----|----|----|----|----|
**************************************************|
12:08:47 Optimization finished
[1] 1.7
Regressing out log10totalcounts

  |                                                                                                                        
  |                                                                                                                  |   0%
  |                                                                                                                        
  |=                                                                                                                 |   1%
  |                                                                                                                        
  |==                                                                                                                |   1%
  |                                                                                                                        
  |==                                                                                                                |   2%
  |                                                                                                                        
  |===                                                                                                               |   2%
  |                                                                                                                        
  |===                                                                                                               |   3%
  |                                                                                                                        
  |====                                                                                                              |   3%
  |                                                                                                                        
  |====                                                                                                              |   4%
  |                                                                                                                        
  |=====                                                                                                             |   4%
  |                                                                                                                        
  |=====                                                                                                             |   5%
  |                                                                                                                        
  |======                                                                                                            |   5%
  |                                                                                                                        
  |======                                                                                                            |   6%
  |                                                                                                                        
  |=======                                                                                                           |   6%
  |                                                                                                                        
  |========                                                                                                          |   7%
  |                                                                                                                        
  |=========                                                                                                         |   8%
  |                                                                                                                        
  |==========                                                                                                        |   8%
  |                                                                                                                        
  |==========                                                                                                        |   9%
  |                                                                                                                        
  |===========                                                                                                       |   9%
  |                                                                                                                        
  |===========                                                                                                       |  10%
  |                                                                                                                        
  |============                                                                                                      |  10%
  |                                                                                                                        
  |============                                                                                                      |  11%
  |                                                                                                                        
  |=============                                                                                                     |  11%
  |                                                                                                                        
  |=============                                                                                                     |  12%
  |                                                                                                                        
  |==============                                                                                                    |  12%
  |                                                                                                                        
  |==============                                                                                                    |  13%
  |                                                                                                                        
  |===============                                                                                                   |  13%
  |                                                                                                                        
  |===============                                                                                                   |  14%
  |                                                                                                                        
  |================                                                                                                  |  14%
  |                                                                                                                        
  |=================                                                                                                 |  15%
  |                                                                                                                        
  |==================                                                                                                |  15%
  |                                                                                                                        
  |==================                                                                                                |  16%
  |                                                                                                                        
  |===================                                                                                               |  16%
  |                                                                                                                        
  |===================                                                                                               |  17%
  |                                                                                                                        
  |====================                                                                                              |  17%
  |                                                                                                                        
  |====================                                                                                              |  18%
  |                                                                                                                        
  |=====================                                                                                             |  18%
  |                                                                                                                        
  |=====================                                                                                             |  19%
  |                                                                                                                        
  |======================                                                                                            |  19%
  |                                                                                                                        
  |======================                                                                                            |  20%
  |                                                                                                                        
  |=======================                                                                                           |  20%
  |                                                                                                                        
  |=======================                                                                                           |  21%
  |                                                                                                                        
  |========================                                                                                          |  21%
  |                                                                                                                        
  |=========================                                                                                         |  22%
  |                                                                                                                        
  |==========================                                                                                        |  23%
  |                                                                                                                        
  |===========================                                                                                       |  23%
  |                                                                                                                        
  |===========================                                                                                       |  24%
  |                                                                                                                        
  |============================                                                                                      |  24%
  |                                                                                                                        
  |============================                                                                                      |  25%
  |                                                                                                                        
  |=============================                                                                                     |  25%
  |                                                                                                                        
  |=============================                                                                                     |  26%
  |                                                                                                                        
  |==============================                                                                                    |  26%
  |                                                                                                                        
  |==============================                                                                                    |  27%
  |                                                                                                                        
  |===============================                                                                                   |  27%
  |                                                                                                                        
  |===============================                                                                                   |  28%
  |                                                                                                                        
  |================================                                                                                  |  28%
  |                                                                                                                        
  |=================================                                                                                 |  29%
  |                                                                                                                        
  |==================================                                                                                |  30%
  |                                                                                                                        
  |===================================                                                                               |  30%
  |                                                                                                                        
  |===================================                                                                               |  31%
  |                                                                                                                        
  |====================================                                                                              |  31%
  |                                                                                                                        
  |====================================                                                                              |  32%
  |                                                                                                                        
  |=====================================                                                                             |  32%
  |                                                                                                                        
  |=====================================                                                                             |  33%
  |                                                                                                                        
  |======================================                                                                            |  33%
  |                                                                                                                        
  |======================================                                                                            |  34%
  |                                                                                                                        
  |=======================================                                                                           |  34%
  |                                                                                                                        
  |=======================================                                                                           |  35%
  |                                                                                                                        
  |========================================                                                                          |  35%
  |                                                                                                                        
  |=========================================                                                                         |  36%
  |                                                                                                                        
  |==========================================                                                                        |  37%
  |                                                                                                                        
  |===========================================                                                                       |  37%
  |                                                                                                                        
  |===========================================                                                                       |  38%
  |                                                                                                                        
  |============================================                                                                      |  38%
  |                                                                                                                        
  |============================================                                                                      |  39%
  |                                                                                                                        
  |=============================================                                                                     |  39%
  |                                                                                                                        
  |=============================================                                                                     |  40%
  |                                                                                                                        
  |==============================================                                                                    |  40%
  |                                                                                                                        
  |==============================================                                                                    |  41%
  |                                                                                                                        
  |===============================================                                                                   |  41%
  |                                                                                                                        
  |===============================================                                                                   |  42%
  |                                                                                                                        
  |================================================                                                                  |  42%
  |                                                                                                                        
  |================================================                                                                  |  43%
  |                                                                                                                        
  |=================================================                                                                 |  43%
  |                                                                                                                        
  |==================================================                                                                |  44%
  |                                                                                                                        
  |===================================================                                                               |  44%
  |                                                                                                                        
  |===================================================                                                               |  45%
  |                                                                                                                        
  |====================================================                                                              |  45%
  |                                                                                                                        
  |====================================================                                                              |  46%
  |                                                                                                                        
  |=====================================================                                                             |  46%
  |                                                                                                                        
  |=====================================================                                                             |  47%
  |                                                                                                                        
  |======================================================                                                            |  47%
  |                                                                                                                        
  |======================================================                                                            |  48%
  |                                                                                                                        
  |=======================================================                                                           |  48%
  |                                                                                                                        
  |=======================================================                                                           |  49%
  |                                                                                                                        
  |========================================================                                                          |  49%
  |                                                                                                                        
  |========================================================                                                          |  50%
  |                                                                                                                        
  |=========================================================                                                         |  50%
  |                                                                                                                        
  |==========================================================                                                        |  50%
  |                                                                                                                        
  |==========================================================                                                        |  51%
  |                                                                                                                        
  |===========================================================                                                       |  51%
  |                                                                                                                        
  |===========================================================                                                       |  52%
  |                                                                                                                        
  |============================================================                                                      |  52%
  |                                                                                                                        
  |============================================================                                                      |  53%
  |                                                                                                                        
  |=============================================================                                                     |  53%
  |                                                                                                                        
  |=============================================================                                                     |  54%
  |                                                                                                                        
  |==============================================================                                                    |  54%
  |                                                                                                                        
  |==============================================================                                                    |  55%
  |                                                                                                                        
  |===============================================================                                                   |  55%
  |                                                                                                                        
  |===============================================================                                                   |  56%
  |                                                                                                                        
  |================================================================                                                  |  56%
  |                                                                                                                        
  |=================================================================                                                 |  57%
  |                                                                                                                        
  |==================================================================                                                |  57%
  |                                                                                                                        
  |==================================================================                                                |  58%
  |                                                                                                                        
  |===================================================================                                               |  58%
  |                                                                                                                        
  |===================================================================                                               |  59%
  |                                                                                                                        
  |====================================================================                                              |  59%
  |                                                                                                                        
  |====================================================================                                              |  60%
  |                                                                                                                        
  |=====================================================================                                             |  60%
  |                                                                                                                        
  |=====================================================================                                             |  61%
  |                                                                                                                        
  |======================================================================                                            |  61%
  |                                                                                                                        
  |======================================================================                                            |  62%
  |                                                                                                                        
  |=======================================================================                                           |  62%
  |                                                                                                                        
  |=======================================================================                                           |  63%
  |                                                                                                                        
  |========================================================================                                          |  63%
  |                                                                                                                        
  |=========================================================================                                         |  64%
  |                                                                                                                        
  |==========================================================================                                        |  65%
  |                                                                                                                        
  |===========================================================================                                       |  65%
  |                                                                                                                        
  |===========================================================================                                       |  66%
  |                                                                                                                        
  |============================================================================                                      |  66%
  |                                                                                                                        
  |============================================================================                                      |  67%
  |                                                                                                                        
  |=============================================================================                                     |  67%
  |                                                                                                                        
  |=============================================================================                                     |  68%
  |                                                                                                                        
  |==============================================================================                                    |  68%
  |                                                                                                                        
  |==============================================================================                                    |  69%
  |                                                                                                                        
  |===============================================================================                                   |  69%
  |                                                                                                                        
  |===============================================================================                                   |  70%
  |                                                                                                                        
  |================================================================================                                  |  70%
  |                                                                                                                        
  |=================================================================================                                 |  71%
  |                                                                                                                        
  |==================================================================================                                |  72%
  |                                                                                                                        
  |===================================================================================                               |  72%
  |                                                                                                                        
  |===================================================================================                               |  73%
  |                                                                                                                        
  |====================================================================================                              |  73%
  |                                                                                                                        
  |====================================================================================                              |  74%
  |                                                                                                                        
  |=====================================================================================                             |  74%
  |                                                                                                                        
  |=====================================================================================                             |  75%
  |                                                                                                                        
  |======================================================================================                            |  75%
  |                                                                                                                        
  |======================================================================================                            |  76%
  |                                                                                                                        
  |=======================================================================================                           |  76%
  |                                                                                                                        
  |=======================================================================================                           |  77%
  |                                                                                                                        
  |========================================================================================                          |  77%
  |                                                                                                                        
  |=========================================================================================                         |  78%
  |                                                                                                                        
  |==========================================================================================                        |  79%
  |                                                                                                                        
  |===========================================================================================                       |  79%
  |                                                                                                                        
  |===========================================================================================                       |  80%
  |                                                                                                                        
  |============================================================================================                      |  80%
  |                                                                                                                        
  |============================================================================================                      |  81%
  |                                                                                                                        
  |=============================================================================================                     |  81%
  |                                                                                                                        
  |=============================================================================================                     |  82%
  |                                                                                                                        
  |==============================================================================================                    |  82%
  |                                                                                                                        
  |==============================================================================================                    |  83%
  |                                                                                                                        
  |===============================================================================================                   |  83%
  |                                                                                                                        
  |===============================================================================================                   |  84%
  |                                                                                                                        
  |================================================================================================                  |  84%
  |                                                                                                                        
  |================================================================================================                  |  85%
  |                                                                                                                        
  |=================================================================================================                 |  85%
  |                                                                                                                        
  |==================================================================================================                |  86%
  |                                                                                                                        
  |===================================================================================================               |  86%
  |                                                                                                                        
  |===================================================================================================               |  87%
  |                                                                                                                        
  |====================================================================================================              |  87%
  |                                                                                                                        
  |====================================================================================================              |  88%
  |                                                                                                                        
  |=====================================================================================================             |  88%
  |                                                                                                                        
  |=====================================================================================================             |  89%
  |                                                                                                                        
  |======================================================================================================            |  89%
  |                                                                                                                        
  |======================================================================================================            |  90%
  |                                                                                                                        
  |=======================================================================================================           |  90%
  |                                                                                                                        
  |=======================================================================================================           |  91%
  |                                                                                                                        
  |========================================================================================================          |  91%
  |                                                                                                                        
  |========================================================================================================          |  92%
  |                                                                                                                        
  |=========================================================================================================         |  92%
  |                                                                                                                        
  |==========================================================================================================        |  93%
  |                                                                                                                        
  |===========================================================================================================       |  94%
  |                                                                                                                        
  |============================================================================================================      |  94%
  |                                                                                                                        
  |============================================================================================================      |  95%
  |                                                                                                                        
  |=============================================================================================================     |  95%
  |                                                                                                                        
  |=============================================================================================================     |  96%
  |                                                                                                                        
  |==============================================================================================================    |  96%
  |                                                                                                                        
  |==============================================================================================================    |  97%
  |                                                                                                                        
  |===============================================================================================================   |  97%
  |                                                                                                                        
  |===============================================================================================================   |  98%
  |                                                                                                                        
  |================================================================================================================  |  98%
  |                                                                                                                        
  |================================================================================================================  |  99%
  |                                                                                                                        
  |================================================================================================================= |  99%
  |                                                                                                                        
  |==================================================================================================================| 100%
Centering and scaling data matrix

  |                                                                                                                        
  |                                                                                                                  |   0%
  |                                                                                                                        
  |==================================================================================================================| 100%
PC_ 1 
Positive:  IGHG2, IGKC, IGHG1, MALAT1, XBP1, MZB1, MZT2A, TYK2, MGP, IFITM1 
       COL3A1, HSP90B1, JCHAIN, GPX1, CALD1, CD38, C1QA, CD81, TAGLN, IFI27 
       RPL34, C1QC, IGHA1, COL1A1, FKBP11, CD27, BST2, TIMP1, HLA-DRB5, IRF4 
Negative:  PSCA, IL17D, EFNA4, LIF, WNT7B, KRT13, STAT5A, CD70, TNFRSF9, PTGES2 
       IL17A, TNFRSF17, CCRL2, MTRNR2L1, APOB, CD53, WIF1, LEP, TWIST2, S100A4 
       CUZD1, KRT20, RAD51, TCL1A, RARG, KRT86, SLC2A4, LGALS9, GDF3, CTSW 
PC_ 2 
Positive:  PTPRCAP, HLA-DQB1, CD37, CXCR5, CD69, CXCR4, HLA-DRB5, PTPRC, KRT15, IL2RG 
       IL2RB, TNFSF12, TNFSF13B, CD48, ARHGDIB, MZT2A, LYZ, CD44, MRC1, HLA-DPA1 
       ITGB2, FES, BTG1, GPR183, NLRC5, RUNX3, TNFRSF13B, JAK2, CSK, SELL 
Negative:  LIF, KRT13, MPO, PTGES2, CCRL2, TNFRSF17, IL17A, TNFRSF9, MTRNR2L1, EFNA4 
       STAT5A, IL17D, LAIR1, WNT7B, IGHG1, WIF1, CD70, PSCA, IGHG2, S100A4 
       SELENOP, C1QB, IGKC, CD53, LGALS9, APOB, KRT86, MZB1, LPAR5, ELANE 
PC_ 3 
Positive:  HLA-DPA1, HLA-DQA1, C1QB, C1QA, HLA-DRB5, C1QC, HLA-DQB1, ITGB2, CCL5, CD53 
       S100A4, LYZ, CD163, FYB1, KRT13, CD68, STAT5A, LIF, PTGES2, CD52 
       LGALS9, IL16, CD37, CD2, CCRL2, NLRC5, EFNA4, TNFRSF9, TNFRSF17, PTPRCAP 
Negative:  MZB1, XBP1, IGHG2, LPAR5, RPS4Y1, TNFAIP6, IGKC, IGHG1, TLR2, WNT5A 
       JCHAIN, PLA2R1, SMARCB1, CD38, COL3A1, CLEC4A, ADGRV1, DNTT, PTGS2, ATF3 
       TAGLN, AGR2, MGP, CSF2, PROKR1, COL1A1, COL5A1, TWIST1, CLOCK, ACKR3 
PC_ 4 
Positive:  WNT7A, VEGFC, PTGDR2, IGHG1, TSLP, IGHG2, WNT9A, KRT13, CXCR5, WIF1 
       WNT7B, ADGRA3, GZMH, FGG, FGF12, IL12A, CD5L, FZD6, DMBT1, TNFRSF9 
       NRIP3, MMP1, TNFRSF13B, WNT5B, IL17D, TNFRSF17, TNFSF9, ATF3, SERPINB5, EFNA4 
Negative:  CSF1R, CLEC4A, TLR2, RPS4Y1, NOD2, FYN, IL12RB1, NRG4, SMARCB1, EPHB6 
       CXCL17, CCL3, TWIST1, IL20, GDF3, COL15A1, TNFAIP6, PTGS2, PLAC8, RAC2 
       CLOCK, CTLA4, ANGPT2, IL15RA, ACKR3, PTGIS, NANOG, AZU1, WNT5A, C1QC 
PC_ 5 
Positive:  TAGLN, COL1A1, COL3A1, MGP, LUM, COL1A2, DCN, COL6A2, C1QC, TIMP1 
       C1QA, CD81, MMP2, CALD1, CXCL12, BGN, SELENOP, COL6A3, C1QB, CD163 
       PDGFRA, HGF, CD68, SLC40A1, SNAI2, IGFBP6, CYP1B1, MS4A4A, MRC2, NGFR 
Negative:  MZB1, CD27, MALAT1, MZT2A, XBP1, CD38, CCL5, IL2RG, FKBP11, FYN 
       DUSP5, JCHAIN, ST6GAL1, IGHG2, CD3E, IRF4, CST7, CD8A, HSP90B1, RAC2 
       KLF2, GAS6, ITGAL, NLRC5, IGHA1, GZMA, DUSP2, CCR2, CD79A, CSF2RB 
12:09:18 UMAP embedding parameters a = 0.9922 b = 1.112
12:09:18 Read 2470 rows and found 20 numeric columns
12:09:18 Using Annoy for neighbor search, n_neighbors = 30
12:09:18 Building Annoy index with metric = cosine, n_trees = 50
0%   10   20   30   40   50   60   70   80   90   100%
[----|----|----|----|----|----|----|----|----|----|
**************************************************|
12:09:18 Writing NN index file to temp file /tmp/RtmpbjSzLh/file4d5f33784dace
12:09:18 Searching Annoy index using 1 thread, search_k = 3000
12:09:19 Annoy recall = 100%
12:09:20 Commencing smooth kNN distance calibration using 1 thread with target n_neighbors = 30
12:09:21 Initializing from normalized Laplacian + noise (using RSpectra)
12:09:21 Commencing optimization for 500 epochs, with 101004 positive edges
Using method 'umap'
0%   10   20   30   40   50   60   70   80   90   100%
[----|----|----|----|----|----|----|----|----|----|
**************************************************|
12:09:23 Optimization finished
[1] 1.8
Regressing out log10totalcounts

  |                                                                                                                        
  |                                                                                                                  |   0%
  |                                                                                                                        
  |=                                                                                                                 |   1%
  |                                                                                                                        
  |==                                                                                                                |   1%
  |                                                                                                                        
  |==                                                                                                                |   2%
  |                                                                                                                        
  |===                                                                                                               |   2%
  |                                                                                                                        
  |===                                                                                                               |   3%
  |                                                                                                                        
  |====                                                                                                              |   3%
  |                                                                                                                        
  |====                                                                                                              |   4%
  |                                                                                                                        
  |=====                                                                                                             |   4%
  |                                                                                                                        
  |=====                                                                                                             |   5%
  |                                                                                                                        
  |======                                                                                                            |   5%
  |                                                                                                                        
  |======                                                                                                            |   6%
  |                                                                                                                        
  |=======                                                                                                           |   6%
  |                                                                                                                        
  |========                                                                                                          |   7%
  |                                                                                                                        
  |=========                                                                                                         |   8%
  |                                                                                                                        
  |==========                                                                                                        |   8%
  |                                                                                                                        
  |==========                                                                                                        |   9%
  |                                                                                                                        
  |===========                                                                                                       |   9%
  |                                                                                                                        
  |===========                                                                                                       |  10%
  |                                                                                                                        
  |============                                                                                                      |  10%
  |                                                                                                                        
  |============                                                                                                      |  11%
  |                                                                                                                        
  |=============                                                                                                     |  11%
  |                                                                                                                        
  |=============                                                                                                     |  12%
  |                                                                                                                        
  |==============                                                                                                    |  12%
  |                                                                                                                        
  |==============                                                                                                    |  13%
  |                                                                                                                        
  |===============                                                                                                   |  13%
  |                                                                                                                        
  |===============                                                                                                   |  14%
  |                                                                                                                        
  |================                                                                                                  |  14%
  |                                                                                                                        
  |=================                                                                                                 |  15%
  |                                                                                                                        
  |==================                                                                                                |  15%
  |                                                                                                                        
  |==================                                                                                                |  16%
  |                                                                                                                        
  |===================                                                                                               |  16%
  |                                                                                                                        
  |===================                                                                                               |  17%
  |                                                                                                                        
  |====================                                                                                              |  17%
  |                                                                                                                        
  |====================                                                                                              |  18%
  |                                                                                                                        
  |=====================                                                                                             |  18%
  |                                                                                                                        
  |=====================                                                                                             |  19%
  |                                                                                                                        
  |======================                                                                                            |  19%
  |                                                                                                                        
  |======================                                                                                            |  20%
  |                                                                                                                        
  |=======================                                                                                           |  20%
  |                                                                                                                        
  |=======================                                                                                           |  21%
  |                                                                                                                        
  |========================                                                                                          |  21%
  |                                                                                                                        
  |=========================                                                                                         |  22%
  |                                                                                                                        
  |==========================                                                                                        |  23%
  |                                                                                                                        
  |===========================                                                                                       |  23%
  |                                                                                                                        
  |===========================                                                                                       |  24%
  |                                                                                                                        
  |============================                                                                                      |  24%
  |                                                                                                                        
  |============================                                                                                      |  25%
  |                                                                                                                        
  |=============================                                                                                     |  25%
  |                                                                                                                        
  |=============================                                                                                     |  26%
  |                                                                                                                        
  |==============================                                                                                    |  26%
  |                                                                                                                        
  |==============================                                                                                    |  27%
  |                                                                                                                        
  |===============================                                                                                   |  27%
  |                                                                                                                        
  |===============================                                                                                   |  28%
  |                                                                                                                        
  |================================                                                                                  |  28%
  |                                                                                                                        
  |=================================                                                                                 |  29%
  |                                                                                                                        
  |==================================                                                                                |  30%
  |                                                                                                                        
  |===================================                                                                               |  30%
  |                                                                                                                        
  |===================================                                                                               |  31%
  |                                                                                                                        
  |====================================                                                                              |  31%
  |                                                                                                                        
  |====================================                                                                              |  32%
  |                                                                                                                        
  |=====================================                                                                             |  32%
  |                                                                                                                        
  |=====================================                                                                             |  33%
  |                                                                                                                        
  |======================================                                                                            |  33%
  |                                                                                                                        
  |======================================                                                                            |  34%
  |                                                                                                                        
  |=======================================                                                                           |  34%
  |                                                                                                                        
  |=======================================                                                                           |  35%
  |                                                                                                                        
  |========================================                                                                          |  35%
  |                                                                                                                        
  |=========================================                                                                         |  36%
  |                                                                                                                        
  |==========================================                                                                        |  37%
  |                                                                                                                        
  |===========================================                                                                       |  37%
  |                                                                                                                        
  |===========================================                                                                       |  38%
  |                                                                                                                        
  |============================================                                                                      |  38%
  |                                                                                                                        
  |============================================                                                                      |  39%
  |                                                                                                                        
  |=============================================                                                                     |  39%
  |                                                                                                                        
  |=============================================                                                                     |  40%
  |                                                                                                                        
  |==============================================                                                                    |  40%
  |                                                                                                                        
  |==============================================                                                                    |  41%
  |                                                                                                                        
  |===============================================                                                                   |  41%
  |                                                                                                                        
  |===============================================                                                                   |  42%
  |                                                                                                                        
  |================================================                                                                  |  42%
  |                                                                                                                        
  |================================================                                                                  |  43%
  |                                                                                                                        
  |=================================================                                                                 |  43%
  |                                                                                                                        
  |==================================================                                                                |  44%
  |                                                                                                                        
  |===================================================                                                               |  44%
  |                                                                                                                        
  |===================================================                                                               |  45%
  |                                                                                                                        
  |====================================================                                                              |  45%
  |                                                                                                                        
  |====================================================                                                              |  46%
  |                                                                                                                        
  |=====================================================                                                             |  46%
  |                                                                                                                        
  |=====================================================                                                             |  47%
  |                                                                                                                        
  |======================================================                                                            |  47%
  |                                                                                                                        
  |======================================================                                                            |  48%
  |                                                                                                                        
  |=======================================================                                                           |  48%
  |                                                                                                                        
  |=======================================================                                                           |  49%
  |                                                                                                                        
  |========================================================                                                          |  49%
  |                                                                                                                        
  |========================================================                                                          |  50%
  |                                                                                                                        
  |=========================================================                                                         |  50%
  |                                                                                                                        
  |==========================================================                                                        |  50%
  |                                                                                                                        
  |==========================================================                                                        |  51%
  |                                                                                                                        
  |===========================================================                                                       |  51%
  |                                                                                                                        
  |===========================================================                                                       |  52%
  |                                                                                                                        
  |============================================================                                                      |  52%
  |                                                                                                                        
  |============================================================                                                      |  53%
  |                                                                                                                        
  |=============================================================                                                     |  53%
  |                                                                                                                        
  |=============================================================                                                     |  54%
  |                                                                                                                        
  |==============================================================                                                    |  54%
  |                                                                                                                        
  |==============================================================                                                    |  55%
  |                                                                                                                        
  |===============================================================                                                   |  55%
  |                                                                                                                        
  |===============================================================                                                   |  56%
  |                                                                                                                        
  |================================================================                                                  |  56%
  |                                                                                                                        
  |=================================================================                                                 |  57%
  |                                                                                                                        
  |==================================================================                                                |  57%
  |                                                                                                                        
  |==================================================================                                                |  58%
  |                                                                                                                        
  |===================================================================                                               |  58%
  |                                                                                                                        
  |===================================================================                                               |  59%
  |                                                                                                                        
  |====================================================================                                              |  59%
  |                                                                                                                        
  |====================================================================                                              |  60%
  |                                                                                                                        
  |=====================================================================                                             |  60%
  |                                                                                                                        
  |=====================================================================                                             |  61%
  |                                                                                                                        
  |======================================================================                                            |  61%
  |                                                                                                                        
  |======================================================================                                            |  62%
  |                                                                                                                        
  |=======================================================================                                           |  62%
  |                                                                                                                        
  |=======================================================================                                           |  63%
  |                                                                                                                        
  |========================================================================                                          |  63%
  |                                                                                                                        
  |=========================================================================                                         |  64%
  |                                                                                                                        
  |==========================================================================                                        |  65%
  |                                                                                                                        
  |===========================================================================                                       |  65%
  |                                                                                                                        
  |===========================================================================                                       |  66%
  |                                                                                                                        
  |============================================================================                                      |  66%
  |                                                                                                                        
  |============================================================================                                      |  67%
  |                                                                                                                        
  |=============================================================================                                     |  67%
  |                                                                                                                        
  |=============================================================================                                     |  68%
  |                                                                                                                        
  |==============================================================================                                    |  68%
  |                                                                                                                        
  |==============================================================================                                    |  69%
  |                                                                                                                        
  |===============================================================================                                   |  69%
  |                                                                                                                        
  |===============================================================================                                   |  70%
  |                                                                                                                        
  |================================================================================                                  |  70%
  |                                                                                                                        
  |=================================================================================                                 |  71%
  |                                                                                                                        
  |==================================================================================                                |  72%
  |                                                                                                                        
  |===================================================================================                               |  72%
  |                                                                                                                        
  |===================================================================================                               |  73%
  |                                                                                                                        
  |====================================================================================                              |  73%
  |                                                                                                                        
  |====================================================================================                              |  74%
  |                                                                                                                        
  |=====================================================================================                             |  74%
  |                                                                                                                        
  |=====================================================================================                             |  75%
  |                                                                                                                        
  |======================================================================================                            |  75%
  |                                                                                                                        
  |======================================================================================                            |  76%
  |                                                                                                                        
  |=======================================================================================                           |  76%
  |                                                                                                                        
  |=======================================================================================                           |  77%
  |                                                                                                                        
  |========================================================================================                          |  77%
  |                                                                                                                        
  |=========================================================================================                         |  78%
  |                                                                                                                        
  |==========================================================================================                        |  79%
  |                                                                                                                        
  |===========================================================================================                       |  79%
  |                                                                                                                        
  |===========================================================================================                       |  80%
  |                                                                                                                        
  |============================================================================================                      |  80%
  |                                                                                                                        
  |============================================================================================                      |  81%
  |                                                                                                                        
  |=============================================================================================                     |  81%
  |                                                                                                                        
  |=============================================================================================                     |  82%
  |                                                                                                                        
  |==============================================================================================                    |  82%
  |                                                                                                                        
  |==============================================================================================                    |  83%
  |                                                                                                                        
  |===============================================================================================                   |  83%
  |                                                                                                                        
  |===============================================================================================                   |  84%
  |                                                                                                                        
  |================================================================================================                  |  84%
  |                                                                                                                        
  |================================================================================================                  |  85%
  |                                                                                                                        
  |=================================================================================================                 |  85%
  |                                                                                                                        
  |==================================================================================================                |  86%
  |                                                                                                                        
  |===================================================================================================               |  86%
  |                                                                                                                        
  |===================================================================================================               |  87%
  |                                                                                                                        
  |====================================================================================================              |  87%
  |                                                                                                                        
  |====================================================================================================              |  88%
  |                                                                                                                        
  |=====================================================================================================             |  88%
  |                                                                                                                        
  |=====================================================================================================             |  89%
  |                                                                                                                        
  |======================================================================================================            |  89%
  |                                                                                                                        
  |======================================================================================================            |  90%
  |                                                                                                                        
  |=======================================================================================================           |  90%
  |                                                                                                                        
  |=======================================================================================================           |  91%
  |                                                                                                                        
  |========================================================================================================          |  91%
  |                                                                                                                        
  |========================================================================================================          |  92%
  |                                                                                                                        
  |=========================================================================================================         |  92%
  |                                                                                                                        
  |==========================================================================================================        |  93%
  |                                                                                                                        
  |===========================================================================================================       |  94%
  |                                                                                                                        
  |============================================================================================================      |  94%
  |                                                                                                                        
  |============================================================================================================      |  95%
  |                                                                                                                        
  |=============================================================================================================     |  95%
  |                                                                                                                        
  |=============================================================================================================     |  96%
  |                                                                                                                        
  |==============================================================================================================    |  96%
  |                                                                                                                        
  |==============================================================================================================    |  97%
  |                                                                                                                        
  |===============================================================================================================   |  97%
  |                                                                                                                        
  |===============================================================================================================   |  98%
  |                                                                                                                        
  |================================================================================================================  |  98%
  |                                                                                                                        
  |================================================================================================================  |  99%
  |                                                                                                                        
  |================================================================================================================= |  99%
  |                                                                                                                        
  |==================================================================================================================| 100%
Centering and scaling data matrix

  |                                                                                                                        
  |                                                                                                                  |   0%
  |                                                                                                                        
  |==================================================================================================================| 100%
PC_ 1 
Positive:  IGKC, IGHG2, IGHG1, XBP1, MALAT1, MZB1, MZT2A, TYK2, MGP, IFITM1 
       COL3A1, HSP90B1, JCHAIN, GPX1, CD38, CALD1, TAGLN, C1QA, CD81, IFI27 
       RPL34, C1QC, FKBP11, IGHA1, COL1A1, CD27, BST2, TIMP1, IRF4, HLA-DRB5 
Negative:  PSCA, IL17D, LIF, EFNA4, WNT7B, KRT13, STAT5A, TNFRSF9, IL17A, CD70 
       TNFRSF17, PTGES2, CCRL2, MTRNR2L1, CD53, APOB, WIF1, TWIST2, LEP, S100A4 
       KRT20, RAD51, CUZD1, TCL1A, RARG, LGALS9, SLC2A4, GDF3, CTSW, KRT86 
PC_ 2 
Positive:  PTPRCAP, HLA-DQB1, HLA-DRB5, CD37, CD69, CXCR5, CXCR4, IL2RG, PTPRC, LYZ 
       KRT15, HLA-DPA1, TNFSF12, ARHGDIB, CD44, ITGB2, CD48, MZT2A, IL2RB, TNFSF13B 
       NLRC5, BTG1, CD52, MRC1, FES, JAK2, GPR183, RUNX3, CD3E, CCL5 
Negative:  LIF, KRT13, MPO, PTGES2, CCRL2, TNFRSF17, IL17A, TNFRSF9, MTRNR2L1, EFNA4 
       IL17D, IGHG1, STAT5A, LAIR1, WIF1, WNT7B, IGHG2, CD70, PSCA, S100A4 
       SELENOP, IGKC, C1QB, APOB, LGALS9, CD53, MZB1, LPAR5, KRT86, XBP1 
PC_ 3 
Positive:  HLA-DPA1, HLA-DQA1, C1QB, C1QA, C1QC, HLA-DRB5, HLA-DQB1, ITGB2, CD53, CCL5 
       S100A4, LYZ, KRT13, CD163, LIF, STAT5A, FYB1, PTGES2, CD68, LGALS9 
       CCRL2, CD52, EFNA4, CD2, TNFRSF9, IL16, TNFRSF17, CD37, MTRNR2L1, NLRC5 
Negative:  MZB1, XBP1, LPAR5, RPS4Y1, IGHG2, TNFAIP6, IGKC, WNT5A, TLR2, PLA2R1 
       CD38, SMARCB1, JCHAIN, IGHG1, DNTT, ADGRV1, ATF3, AGR2, PTGS2, COL3A1 
       PROKR1, TSLP, COL1A1, TAGLN, CLEC4A, ACKR3, IRF4, CSF2, MGP, THBS2 
PC_ 4 
Positive:  WNT7A, PTGDR2, IGHG1, VEGFC, WIF1, TSLP, KRT13, IGHG2, ADGRA3, GZMH 
       WNT7B, CXCR5, CD5L, TNFRSF9, FGG, WNT9A, TNFRSF17, FZD6, FGF12, IL17D 
       IL12A, NRIP3, DMBT1, MMP1, TNFSF9, ADGRG5, WNT5B, EFNA4, STAT5A, RB1 
Negative:  CSF1R, CLEC4A, TLR2, RPS4Y1, SMARCB1, IL12RB1, FYN, NOD2, NRG4, CXCL17 
       EPHB6, TWIST1, CCL3, GDF3, IL20, TNFAIP6, CTLA4, PTGS2, PLAC8, COL15A1 
       RAC2, IL15RA, CLOCK, PTGIS, AZU1, ACKR3, ANGPT2, NANOG, WNT5A, C1QC 
PC_ 5 
Positive:  MZB1, CD27, MZT2A, XBP1, MALAT1, CD38, CCL5, FYN, IL2RG, FKBP11 
       IGHG2, DUSP5, CD3E, ST6GAL1, CD8A, CST7, IRF4, GAS6, RAC2, ITGAL 
       GZMA, NLRC5, CCR2, CCR5, JCHAIN, KLF2, HMGN2, NKG7, CD52, DUSP2 
Negative:  TAGLN, COL3A1, COL1A1, MGP, LUM, COL1A2, DCN, COL6A2, C1QC, TIMP1 
       CD81, C1QA, CALD1, MMP2, CXCL12, COL6A3, SELENOP, BGN, C1QB, CD163 
       PDGFRA, HGF, CD68, SLC40A1, SNAI2, IGFBP6, CYP1B1, MRC2, MS4A4A, NGFR 
12:09:52 UMAP embedding parameters a = 0.9922 b = 1.112
12:09:52 Read 2263 rows and found 20 numeric columns
12:09:52 Using Annoy for neighbor search, n_neighbors = 30
12:09:52 Building Annoy index with metric = cosine, n_trees = 50
0%   10   20   30   40   50   60   70   80   90   100%
[----|----|----|----|----|----|----|----|----|----|
**************************************************|
12:09:52 Writing NN index file to temp file /tmp/RtmpbjSzLh/file4d5f367cad289
12:09:52 Searching Annoy index using 1 thread, search_k = 3000
12:09:53 Annoy recall = 100%
12:09:53 Commencing smooth kNN distance calibration using 1 thread with target n_neighbors = 30
12:09:54 Initializing from normalized Laplacian + noise (using RSpectra)
12:09:54 Commencing optimization for 500 epochs, with 92020 positive edges
Using method 'umap'
0%   10   20   30   40   50   60   70   80   90   100%
[----|----|----|----|----|----|----|----|----|----|
**************************************************|
12:09:57 Optimization finished
[1] 1.9
Regressing out log10totalcounts

  |                                                                                                                        
  |                                                                                                                  |   0%
  |                                                                                                                        
  |=                                                                                                                 |   1%
  |                                                                                                                        
  |==                                                                                                                |   1%
  |                                                                                                                        
  |==                                                                                                                |   2%
  |                                                                                                                        
  |===                                                                                                               |   2%
  |                                                                                                                        
  |===                                                                                                               |   3%
  |                                                                                                                        
  |====                                                                                                              |   3%
  |                                                                                                                        
  |====                                                                                                              |   4%
  |                                                                                                                        
  |=====                                                                                                             |   4%
  |                                                                                                                        
  |=====                                                                                                             |   5%
  |                                                                                                                        
  |======                                                                                                            |   5%
  |                                                                                                                        
  |======                                                                                                            |   6%
  |                                                                                                                        
  |=======                                                                                                           |   6%
  |                                                                                                                        
  |========                                                                                                          |   7%
  |                                                                                                                        
  |=========                                                                                                         |   8%
  |                                                                                                                        
  |==========                                                                                                        |   8%
  |                                                                                                                        
  |==========                                                                                                        |   9%
  |                                                                                                                        
  |===========                                                                                                       |   9%
  |                                                                                                                        
  |===========                                                                                                       |  10%
  |                                                                                                                        
  |============                                                                                                      |  10%
  |                                                                                                                        
  |============                                                                                                      |  11%
  |                                                                                                                        
  |=============                                                                                                     |  11%
  |                                                                                                                        
  |=============                                                                                                     |  12%
  |                                                                                                                        
  |==============                                                                                                    |  12%
  |                                                                                                                        
  |==============                                                                                                    |  13%
  |                                                                                                                        
  |===============                                                                                                   |  13%
  |                                                                                                                        
  |===============                                                                                                   |  14%
  |                                                                                                                        
  |================                                                                                                  |  14%
  |                                                                                                                        
  |=================                                                                                                 |  15%
  |                                                                                                                        
  |==================                                                                                                |  15%
  |                                                                                                                        
  |==================                                                                                                |  16%
  |                                                                                                                        
  |===================                                                                                               |  16%
  |                                                                                                                        
  |===================                                                                                               |  17%
  |                                                                                                                        
  |====================                                                                                              |  17%
  |                                                                                                                        
  |====================                                                                                              |  18%
  |                                                                                                                        
  |=====================                                                                                             |  18%
  |                                                                                                                        
  |=====================                                                                                             |  19%
  |                                                                                                                        
  |======================                                                                                            |  19%
  |                                                                                                                        
  |======================                                                                                            |  20%
  |                                                                                                                        
  |=======================                                                                                           |  20%
  |                                                                                                                        
  |=======================                                                                                           |  21%
  |                                                                                                                        
  |========================                                                                                          |  21%
  |                                                                                                                        
  |=========================                                                                                         |  22%
  |                                                                                                                        
  |==========================                                                                                        |  23%
  |                                                                                                                        
  |===========================                                                                                       |  23%
  |                                                                                                                        
  |===========================                                                                                       |  24%
  |                                                                                                                        
  |============================                                                                                      |  24%
  |                                                                                                                        
  |============================                                                                                      |  25%
  |                                                                                                                        
  |=============================                                                                                     |  25%
  |                                                                                                                        
  |=============================                                                                                     |  26%
  |                                                                                                                        
  |==============================                                                                                    |  26%
  |                                                                                                                        
  |==============================                                                                                    |  27%
  |                                                                                                                        
  |===============================                                                                                   |  27%
  |                                                                                                                        
  |===============================                                                                                   |  28%
  |                                                                                                                        
  |================================                                                                                  |  28%
  |                                                                                                                        
  |=================================                                                                                 |  29%
  |                                                                                                                        
  |==================================                                                                                |  30%
  |                                                                                                                        
  |===================================                                                                               |  30%
  |                                                                                                                        
  |===================================                                                                               |  31%
  |                                                                                                                        
  |====================================                                                                              |  31%
  |                                                                                                                        
  |====================================                                                                              |  32%
  |                                                                                                                        
  |=====================================                                                                             |  32%
  |                                                                                                                        
  |=====================================                                                                             |  33%
  |                                                                                                                        
  |======================================                                                                            |  33%
  |                                                                                                                        
  |======================================                                                                            |  34%
  |                                                                                                                        
  |=======================================                                                                           |  34%
  |                                                                                                                        
  |=======================================                                                                           |  35%
  |                                                                                                                        
  |========================================                                                                          |  35%
  |                                                                                                                        
  |=========================================                                                                         |  36%
  |                                                                                                                        
  |==========================================                                                                        |  37%
  |                                                                                                                        
  |===========================================                                                                       |  37%
  |                                                                                                                        
  |===========================================                                                                       |  38%
  |                                                                                                                        
  |============================================                                                                      |  38%
  |                                                                                                                        
  |============================================                                                                      |  39%
  |                                                                                                                        
  |=============================================                                                                     |  39%
  |                                                                                                                        
  |=============================================                                                                     |  40%
  |                                                                                                                        
  |==============================================                                                                    |  40%
  |                                                                                                                        
  |==============================================                                                                    |  41%
  |                                                                                                                        
  |===============================================                                                                   |  41%
  |                                                                                                                        
  |===============================================                                                                   |  42%
  |                                                                                                                        
  |================================================                                                                  |  42%
  |                                                                                                                        
  |================================================                                                                  |  43%
  |                                                                                                                        
  |=================================================                                                                 |  43%
  |                                                                                                                        
  |==================================================                                                                |  44%
  |                                                                                                                        
  |===================================================                                                               |  44%
  |                                                                                                                        
  |===================================================                                                               |  45%
  |                                                                                                                        
  |====================================================                                                              |  45%
  |                                                                                                                        
  |====================================================                                                              |  46%
  |                                                                                                                        
  |=====================================================                                                             |  46%
  |                                                                                                                        
  |=====================================================                                                             |  47%
  |                                                                                                                        
  |======================================================                                                            |  47%
  |                                                                                                                        
  |======================================================                                                            |  48%
  |                                                                                                                        
  |=======================================================                                                           |  48%
  |                                                                                                                        
  |=======================================================                                                           |  49%
  |                                                                                                                        
  |========================================================                                                          |  49%
  |                                                                                                                        
  |========================================================                                                          |  50%
  |                                                                                                                        
  |=========================================================                                                         |  50%
  |                                                                                                                        
  |==========================================================                                                        |  50%
  |                                                                                                                        
  |==========================================================                                                        |  51%
  |                                                                                                                        
  |===========================================================                                                       |  51%
  |                                                                                                                        
  |===========================================================                                                       |  52%
  |                                                                                                                        
  |============================================================                                                      |  52%
  |                                                                                                                        
  |============================================================                                                      |  53%
  |                                                                                                                        
  |=============================================================                                                     |  53%
  |                                                                                                                        
  |=============================================================                                                     |  54%
  |                                                                                                                        
  |==============================================================                                                    |  54%
  |                                                                                                                        
  |==============================================================                                                    |  55%
  |                                                                                                                        
  |===============================================================                                                   |  55%
  |                                                                                                                        
  |===============================================================                                                   |  56%
  |                                                                                                                        
  |================================================================                                                  |  56%
  |                                                                                                                        
  |=================================================================                                                 |  57%
  |                                                                                                                        
  |==================================================================                                                |  57%
  |                                                                                                                        
  |==================================================================                                                |  58%
  |                                                                                                                        
  |===================================================================                                               |  58%
  |                                                                                                                        
  |===================================================================                                               |  59%
  |                                                                                                                        
  |====================================================================                                              |  59%
  |                                                                                                                        
  |====================================================================                                              |  60%
  |                                                                                                                        
  |=====================================================================                                             |  60%
  |                                                                                                                        
  |=====================================================================                                             |  61%
  |                                                                                                                        
  |======================================================================                                            |  61%
  |                                                                                                                        
  |======================================================================                                            |  62%
  |                                                                                                                        
  |=======================================================================                                           |  62%
  |                                                                                                                        
  |=======================================================================                                           |  63%
  |                                                                                                                        
  |========================================================================                                          |  63%
  |                                                                                                                        
  |=========================================================================                                         |  64%
  |                                                                                                                        
  |==========================================================================                                        |  65%
  |                                                                                                                        
  |===========================================================================                                       |  65%
  |                                                                                                                        
  |===========================================================================                                       |  66%
  |                                                                                                                        
  |============================================================================                                      |  66%
  |                                                                                                                        
  |============================================================================                                      |  67%
  |                                                                                                                        
  |=============================================================================                                     |  67%
  |                                                                                                                        
  |=============================================================================                                     |  68%
  |                                                                                                                        
  |==============================================================================                                    |  68%
  |                                                                                                                        
  |==============================================================================                                    |  69%
  |                                                                                                                        
  |===============================================================================                                   |  69%
  |                                                                                                                        
  |===============================================================================                                   |  70%
  |                                                                                                                        
  |================================================================================                                  |  70%
  |                                                                                                                        
  |=================================================================================                                 |  71%
  |                                                                                                                        
  |==================================================================================                                |  72%
  |                                                                                                                        
  |===================================================================================                               |  72%
  |                                                                                                                        
  |===================================================================================                               |  73%
  |                                                                                                                        
  |====================================================================================                              |  73%
  |                                                                                                                        
  |====================================================================================                              |  74%
  |                                                                                                                        
  |=====================================================================================                             |  74%
  |                                                                                                                        
  |=====================================================================================                             |  75%
  |                                                                                                                        
  |======================================================================================                            |  75%
  |                                                                                                                        
  |======================================================================================                            |  76%
  |                                                                                                                        
  |=======================================================================================                           |  76%
  |                                                                                                                        
  |=======================================================================================                           |  77%
  |                                                                                                                        
  |========================================================================================                          |  77%
  |                                                                                                                        
  |=========================================================================================                         |  78%
  |                                                                                                                        
  |==========================================================================================                        |  79%
  |                                                                                                                        
  |===========================================================================================                       |  79%
  |                                                                                                                        
  |===========================================================================================                       |  80%
  |                                                                                                                        
  |============================================================================================                      |  80%
  |                                                                                                                        
  |============================================================================================                      |  81%
  |                                                                                                                        
  |=============================================================================================                     |  81%
  |                                                                                                                        
  |=============================================================================================                     |  82%
  |                                                                                                                        
  |==============================================================================================                    |  82%
  |                                                                                                                        
  |==============================================================================================                    |  83%
  |                                                                                                                        
  |===============================================================================================                   |  83%
  |                                                                                                                        
  |===============================================================================================                   |  84%
  |                                                                                                                        
  |================================================================================================                  |  84%
  |                                                                                                                        
  |================================================================================================                  |  85%
  |                                                                                                                        
  |=================================================================================================                 |  85%
  |                                                                                                                        
  |==================================================================================================                |  86%
  |                                                                                                                        
  |===================================================================================================               |  86%
  |                                                                                                                        
  |===================================================================================================               |  87%
  |                                                                                                                        
  |====================================================================================================              |  87%
  |                                                                                                                        
  |====================================================================================================              |  88%
  |                                                                                                                        
  |=====================================================================================================             |  88%
  |                                                                                                                        
  |=====================================================================================================             |  89%
  |                                                                                                                        
  |======================================================================================================            |  89%
  |                                                                                                                        
  |======================================================================================================            |  90%
  |                                                                                                                        
  |=======================================================================================================           |  90%
  |                                                                                                                        
  |=======================================================================================================           |  91%
  |                                                                                                                        
  |========================================================================================================          |  91%
  |                                                                                                                        
  |========================================================================================================          |  92%
  |                                                                                                                        
  |=========================================================================================================         |  92%
  |                                                                                                                        
  |==========================================================================================================        |  93%
  |                                                                                                                        
  |===========================================================================================================       |  94%
  |                                                                                                                        
  |============================================================================================================      |  94%
  |                                                                                                                        
  |============================================================================================================      |  95%
  |                                                                                                                        
  |=============================================================================================================     |  95%
  |                                                                                                                        
  |=============================================================================================================     |  96%
  |                                                                                                                        
  |==============================================================================================================    |  96%
  |                                                                                                                        
  |==============================================================================================================    |  97%
  |                                                                                                                        
  |===============================================================================================================   |  97%
  |                                                                                                                        
  |===============================================================================================================   |  98%
  |                                                                                                                        
  |================================================================================================================  |  98%
  |                                                                                                                        
  |================================================================================================================  |  99%
  |                                                                                                                        
  |================================================================================================================= |  99%
  |                                                                                                                        
  |==================================================================================================================| 100%
Centering and scaling data matrix

  |                                                                                                                        
  |                                                                                                                  |   0%
  |                                                                                                                        
  |==================================================================================================================| 100%
PC_ 1 
Positive:  IGKC, IGHG2, IGHG1, MALAT1, XBP1, MZT2A, MZB1, TYK2, MGP, IFITM1 
       COL3A1, HSP90B1, JCHAIN, GPX1, CALD1, CD38, TAGLN, C1QA, CD81, IFI27 
       RPL34, C1QC, FKBP11, COL1A1, IGHA1, CD27, BST2, TIMP1, IRF4, HLA-DRB5 
Negative:  PSCA, IL17D, EFNA4, LIF, WNT7B, STAT5A, KRT13, IL17A, CD70, TNFRSF9 
       TNFRSF17, PTGES2, CCRL2, MTRNR2L1, CD53, APOB, WIF1, TWIST2, LEP, CUZD1 
       S100A4, TCL1A, RAD51, KRT20, SLC2A4, RARG, LGALS9, KRT86, CTSW, GDF3 
PC_ 2 
Positive:  PTPRCAP, HLA-DRB5, HLA-DQB1, CD69, CXCR5, CXCR4, IL2RG, CD37, KRT15, PTPRC 
       LYZ, ITGB2, CD44, CD48, HLA-DPA1, ARHGDIB, IL2RB, TNFSF12, NLRC5, MRC1 
       TNFSF13B, JAK2, CD52, BTG1, MZT2A, GPR183, FES, IL10RA, RUNX3, CD3E 
Negative:  LIF, MPO, KRT13, PTGES2, CCRL2, TNFRSF17, IL17A, TNFRSF9, MTRNR2L1, EFNA4 
       IL17D, IGHG1, STAT5A, LAIR1, WNT7B, WIF1, IGHG2, CD70, PSCA, S100A4 
       SELENOP, IGKC, C1QB, CD53, LGALS9, APOB, MZB1, LPAR5, KRT86, XBP1 
PC_ 3 
Positive:  MZB1, XBP1, LPAR5, IGHG2, RPS4Y1, TNFAIP6, TLR2, WNT5A, PLA2R1, CD38 
       IGKC, ATF3, IGHG1, COL3A1, SMARCB1, DNTT, JCHAIN, ADGRV1, AGR2, PROKR1 
       TAGLN, TSLP, IRF4, COL1A1, PTGS2, FKBP11, CSF2, BMP6, THBS2, GC 
Negative:  HLA-DPA1, HLA-DQA1, C1QB, C1QC, C1QA, HLA-DRB5, HLA-DQB1, ITGB2, CD53, S100A4 
       CCL5, LYZ, CD163, KRT13, LIF, STAT5A, PTGES2, FYB1, CD68, LGALS9 
       CCRL2, EFNA4, TNFRSF9, CD2, CD52, IL16, MTRNR2L1, CD37, TNFRSF17, NLRC5 
PC_ 4 
Positive:  WNT7A, PTGDR2, KRT13, TSLP, VEGFC, WIF1, IGHG1, IGHG2, GZMH, TNFRSF17 
       FZD6, CD5L, CXCR5, WNT7B, TNFRSF9, ADGRA3, MMP1, IL12A, WNT9A, FGF12 
       FGG, IL17D, ADGRG5, XCL2, LIF, WNT5B, NRIP3, DMBT1, STAT5A, TNFSF9 
Negative:  CSF1R, CLEC4A, RPS4Y1, TLR2, SMARCB1, IL12RB1, NRG4, CXCL17, FYN, EPHB6 
       NOD2, TWIST1, GDF3, CCL3, IL20, TNFAIP6, PTGIS, CTLA4, IL15RA, RAC2 
       PTGS2, CLOCK, COL15A1, AZU1, PLAC8, ACKR3, NANOG, ANGPT2, LUM, WNT5A 
PC_ 5 
Positive:  TAGLN, COL1A1, COL3A1, MGP, LUM, COL1A2, DCN, COL6A2, CD81, CALD1 
       TIMP1, C1QC, CXCL12, COL6A3, BGN, SELENOP, MMP2, C1QA, PDGFRA, C1QB 
       CD163, HGF, CD68, SLC40A1, SNAI2, IGFBP6, CYP1B1, MRC2, MS4A4A, PTGDS 
Negative:  MZB1, CD27, XBP1, CD38, MZT2A, MALAT1, CCL5, IL2RG, FKBP11, FYN 
       DUSP5, CST7, IGHG2, GZMA, CD3E, ST6GAL1, CD8A, JCHAIN, RAC2, IRF4 
       GAS6, NLRC5, CCR2, ITGAL, CCR5, ICOS, IGHA1, CD79A, NKG7, CD52 
12:10:23 UMAP embedding parameters a = 0.9922 b = 1.112
12:10:23 Read 2040 rows and found 20 numeric columns
12:10:23 Using Annoy for neighbor search, n_neighbors = 30
12:10:23 Building Annoy index with metric = cosine, n_trees = 50
0%   10   20   30   40   50   60   70   80   90   100%
[----|----|----|----|----|----|----|----|----|----|
**************************************************|
12:10:23 Writing NN index file to temp file /tmp/RtmpbjSzLh/file4d5f329243be0
12:10:23 Searching Annoy index using 1 thread, search_k = 3000
12:10:23 Annoy recall = 100%
12:10:24 Commencing smooth kNN distance calibration using 1 thread with target n_neighbors = 30
12:10:25 Initializing from normalized Laplacian + noise (using RSpectra)
12:10:25 Commencing optimization for 500 epochs, with 82602 positive edges
Using method 'umap'
0%   10   20   30   40   50   60   70   80   90   100%
[----|----|----|----|----|----|----|----|----|----|
**************************************************|
12:10:27 Optimization finished
[1] 2
Regressing out log10totalcounts

  |                                                                                                                        
  |                                                                                                                  |   0%
  |                                                                                                                        
  |=                                                                                                                 |   1%
  |                                                                                                                        
  |==                                                                                                                |   1%
  |                                                                                                                        
  |==                                                                                                                |   2%
  |                                                                                                                        
  |===                                                                                                               |   2%
  |                                                                                                                        
  |===                                                                                                               |   3%
  |                                                                                                                        
  |====                                                                                                              |   3%
  |                                                                                                                        
  |====                                                                                                              |   4%
  |                                                                                                                        
  |=====                                                                                                             |   4%
  |                                                                                                                        
  |=====                                                                                                             |   5%
  |                                                                                                                        
  |======                                                                                                            |   5%
  |                                                                                                                        
  |======                                                                                                            |   6%
  |                                                                                                                        
  |=======                                                                                                           |   6%
  |                                                                                                                        
  |========                                                                                                          |   7%
  |                                                                                                                        
  |=========                                                                                                         |   8%
  |                                                                                                                        
  |==========                                                                                                        |   8%
  |                                                                                                                        
  |==========                                                                                                        |   9%
  |                                                                                                                        
  |===========                                                                                                       |   9%
  |                                                                                                                        
  |===========                                                                                                       |  10%
  |                                                                                                                        
  |============                                                                                                      |  10%
  |                                                                                                                        
  |============                                                                                                      |  11%
  |                                                                                                                        
  |=============                                                                                                     |  11%
  |                                                                                                                        
  |=============                                                                                                     |  12%
  |                                                                                                                        
  |==============                                                                                                    |  12%
  |                                                                                                                        
  |==============                                                                                                    |  13%
  |                                                                                                                        
  |===============                                                                                                   |  13%
  |                                                                                                                        
  |===============                                                                                                   |  14%
  |                                                                                                                        
  |================                                                                                                  |  14%
  |                                                                                                                        
  |=================                                                                                                 |  15%
  |                                                                                                                        
  |==================                                                                                                |  15%
  |                                                                                                                        
  |==================                                                                                                |  16%
  |                                                                                                                        
  |===================                                                                                               |  16%
  |                                                                                                                        
  |===================                                                                                               |  17%
  |                                                                                                                        
  |====================                                                                                              |  17%
  |                                                                                                                        
  |====================                                                                                              |  18%
  |                                                                                                                        
  |=====================                                                                                             |  18%
  |                                                                                                                        
  |=====================                                                                                             |  19%
  |                                                                                                                        
  |======================                                                                                            |  19%
  |                                                                                                                        
  |======================                                                                                            |  20%
  |                                                                                                                        
  |=======================                                                                                           |  20%
  |                                                                                                                        
  |=======================                                                                                           |  21%
  |                                                                                                                        
  |========================                                                                                          |  21%
  |                                                                                                                        
  |=========================                                                                                         |  22%
  |                                                                                                                        
  |==========================                                                                                        |  23%
  |                                                                                                                        
  |===========================                                                                                       |  23%
  |                                                                                                                        
  |===========================                                                                                       |  24%
  |                                                                                                                        
  |============================                                                                                      |  24%
  |                                                                                                                        
  |============================                                                                                      |  25%
  |                                                                                                                        
  |=============================                                                                                     |  25%
  |                                                                                                                        
  |=============================                                                                                     |  26%
  |                                                                                                                        
  |==============================                                                                                    |  26%
  |                                                                                                                        
  |==============================                                                                                    |  27%
  |                                                                                                                        
  |===============================                                                                                   |  27%
  |                                                                                                                        
  |===============================                                                                                   |  28%
  |                                                                                                                        
  |================================                                                                                  |  28%
  |                                                                                                                        
  |=================================                                                                                 |  29%
  |                                                                                                                        
  |==================================                                                                                |  30%
  |                                                                                                                        
  |===================================                                                                               |  30%
  |                                                                                                                        
  |===================================                                                                               |  31%
  |                                                                                                                        
  |====================================                                                                              |  31%
  |                                                                                                                        
  |====================================                                                                              |  32%
  |                                                                                                                        
  |=====================================                                                                             |  32%
  |                                                                                                                        
  |=====================================                                                                             |  33%
  |                                                                                                                        
  |======================================                                                                            |  33%
  |                                                                                                                        
  |======================================                                                                            |  34%
  |                                                                                                                        
  |=======================================                                                                           |  34%
  |                                                                                                                        
  |=======================================                                                                           |  35%
  |                                                                                                                        
  |========================================                                                                          |  35%
  |                                                                                                                        
  |=========================================                                                                         |  36%
  |                                                                                                                        
  |==========================================                                                                        |  37%
  |                                                                                                                        
  |===========================================                                                                       |  37%
  |                                                                                                                        
  |===========================================                                                                       |  38%
  |                                                                                                                        
  |============================================                                                                      |  38%
  |                                                                                                                        
  |============================================                                                                      |  39%
  |                                                                                                                        
  |=============================================                                                                     |  39%
  |                                                                                                                        
  |=============================================                                                                     |  40%
  |                                                                                                                        
  |==============================================                                                                    |  40%
  |                                                                                                                        
  |==============================================                                                                    |  41%
  |                                                                                                                        
  |===============================================                                                                   |  41%
  |                                                                                                                        
  |===============================================                                                                   |  42%
  |                                                                                                                        
  |================================================                                                                  |  42%
  |                                                                                                                        
  |================================================                                                                  |  43%
  |                                                                                                                        
  |=================================================                                                                 |  43%
  |                                                                                                                        
  |==================================================                                                                |  44%
  |                                                                                                                        
  |===================================================                                                               |  44%
  |                                                                                                                        
  |===================================================                                                               |  45%
  |                                                                                                                        
  |====================================================                                                              |  45%
  |                                                                                                                        
  |====================================================                                                              |  46%
  |                                                                                                                        
  |=====================================================                                                             |  46%
  |                                                                                                                        
  |=====================================================                                                             |  47%
  |                                                                                                                        
  |======================================================                                                            |  47%
  |                                                                                                                        
  |======================================================                                                            |  48%
  |                                                                                                                        
  |=======================================================                                                           |  48%
  |                                                                                                                        
  |=======================================================                                                           |  49%
  |                                                                                                                        
  |========================================================                                                          |  49%
  |                                                                                                                        
  |========================================================                                                          |  50%
  |                                                                                                                        
  |=========================================================                                                         |  50%
  |                                                                                                                        
  |==========================================================                                                        |  50%
  |                                                                                                                        
  |==========================================================                                                        |  51%
  |                                                                                                                        
  |===========================================================                                                       |  51%
  |                                                                                                                        
  |===========================================================                                                       |  52%
  |                                                                                                                        
  |============================================================                                                      |  52%
  |                                                                                                                        
  |============================================================                                                      |  53%
  |                                                                                                                        
  |=============================================================                                                     |  53%
  |                                                                                                                        
  |=============================================================                                                     |  54%
  |                                                                                                                        
  |==============================================================                                                    |  54%
  |                                                                                                                        
  |==============================================================                                                    |  55%
  |                                                                                                                        
  |===============================================================                                                   |  55%
  |                                                                                                                        
  |===============================================================                                                   |  56%
  |                                                                                                                        
  |================================================================                                                  |  56%
  |                                                                                                                        
  |=================================================================                                                 |  57%
  |                                                                                                                        
  |==================================================================                                                |  57%
  |                                                                                                                        
  |==================================================================                                                |  58%
  |                                                                                                                        
  |===================================================================                                               |  58%
  |                                                                                                                        
  |===================================================================                                               |  59%
  |                                                                                                                        
  |====================================================================                                              |  59%
  |                                                                                                                        
  |====================================================================                                              |  60%
  |                                                                                                                        
  |=====================================================================                                             |  60%
  |                                                                                                                        
  |=====================================================================                                             |  61%
  |                                                                                                                        
  |======================================================================                                            |  61%
  |                                                                                                                        
  |======================================================================                                            |  62%
  |                                                                                                                        
  |=======================================================================                                           |  62%
  |                                                                                                                        
  |=======================================================================                                           |  63%
  |                                                                                                                        
  |========================================================================                                          |  63%
  |                                                                                                                        
  |=========================================================================                                         |  64%
  |                                                                                                                        
  |==========================================================================                                        |  65%
  |                                                                                                                        
  |===========================================================================                                       |  65%
  |                                                                                                                        
  |===========================================================================                                       |  66%
  |                                                                                                                        
  |============================================================================                                      |  66%
  |                                                                                                                        
  |============================================================================                                      |  67%
  |                                                                                                                        
  |=============================================================================                                     |  67%
  |                                                                                                                        
  |=============================================================================                                     |  68%
  |                                                                                                                        
  |==============================================================================                                    |  68%
  |                                                                                                                        
  |==============================================================================                                    |  69%
  |                                                                                                                        
  |===============================================================================                                   |  69%
  |                                                                                                                        
  |===============================================================================                                   |  70%
  |                                                                                                                        
  |================================================================================                                  |  70%
  |                                                                                                                        
  |=================================================================================                                 |  71%
  |                                                                                                                        
  |==================================================================================                                |  72%
  |                                                                                                                        
  |===================================================================================                               |  72%
  |                                                                                                                        
  |===================================================================================                               |  73%
  |                                                                                                                        
  |====================================================================================                              |  73%
  |                                                                                                                        
  |====================================================================================                              |  74%
  |                                                                                                                        
  |=====================================================================================                             |  74%
  |                                                                                                                        
  |=====================================================================================                             |  75%
  |                                                                                                                        
  |======================================================================================                            |  75%
  |                                                                                                                        
  |======================================================================================                            |  76%
  |                                                                                                                        
  |=======================================================================================                           |  76%
  |                                                                                                                        
  |=======================================================================================                           |  77%
  |                                                                                                                        
  |========================================================================================                          |  77%
  |                                                                                                                        
  |=========================================================================================                         |  78%
  |                                                                                                                        
  |==========================================================================================                        |  79%
  |                                                                                                                        
  |===========================================================================================                       |  79%
  |                                                                                                                        
  |===========================================================================================                       |  80%
  |                                                                                                                        
  |============================================================================================                      |  80%
  |                                                                                                                        
  |============================================================================================                      |  81%
  |                                                                                                                        
  |=============================================================================================                     |  81%
  |                                                                                                                        
  |=============================================================================================                     |  82%
  |                                                                                                                        
  |==============================================================================================                    |  82%
  |                                                                                                                        
  |==============================================================================================                    |  83%
  |                                                                                                                        
  |===============================================================================================                   |  83%
  |                                                                                                                        
  |===============================================================================================                   |  84%
  |                                                                                                                        
  |================================================================================================                  |  84%
  |                                                                                                                        
  |================================================================================================                  |  85%
  |                                                                                                                        
  |=================================================================================================                 |  85%
  |                                                                                                                        
  |==================================================================================================                |  86%
  |                                                                                                                        
  |===================================================================================================               |  86%
  |                                                                                                                        
  |===================================================================================================               |  87%
  |                                                                                                                        
  |====================================================================================================              |  87%
  |                                                                                                                        
  |====================================================================================================              |  88%
  |                                                                                                                        
  |=====================================================================================================             |  88%
  |                                                                                                                        
  |=====================================================================================================             |  89%
  |                                                                                                                        
  |======================================================================================================            |  89%
  |                                                                                                                        
  |======================================================================================================            |  90%
  |                                                                                                                        
  |=======================================================================================================           |  90%
  |                                                                                                                        
  |=======================================================================================================           |  91%
  |                                                                                                                        
  |========================================================================================================          |  91%
  |                                                                                                                        
  |========================================================================================================          |  92%
  |                                                                                                                        
  |=========================================================================================================         |  92%
  |                                                                                                                        
  |==========================================================================================================        |  93%
  |                                                                                                                        
  |===========================================================================================================       |  94%
  |                                                                                                                        
  |============================================================================================================      |  94%
  |                                                                                                                        
  |============================================================================================================      |  95%
  |                                                                                                                        
  |=============================================================================================================     |  95%
  |                                                                                                                        
  |=============================================================================================================     |  96%
  |                                                                                                                        
  |==============================================================================================================    |  96%
  |                                                                                                                        
  |==============================================================================================================    |  97%
  |                                                                                                                        
  |===============================================================================================================   |  97%
  |                                                                                                                        
  |===============================================================================================================   |  98%
  |                                                                                                                        
  |================================================================================================================  |  98%
  |                                                                                                                        
  |================================================================================================================  |  99%
  |                                                                                                                        
  |================================================================================================================= |  99%
  |                                                                                                                        
  |==================================================================================================================| 100%
Centering and scaling data matrix

  |                                                                                                                        
  |                                                                                                                  |   0%
  |                                                                                                                        
  |==================================================================================================================| 100%
PC_ 1 
Positive:  IGKC, IGHG2, IGHG1, MALAT1, MZT2A, XBP1, MZB1, TYK2, IFITM1, MGP 
       COL3A1, HSP90B1, CD38, GPX1, JCHAIN, CALD1, CD81, TAGLN, C1QA, IFI27 
       RPL34, FKBP11, COL1A1, C1QC, IGHA1, CD27, BST2, TIMP1, LPAR5, IRF4 
Negative:  PSCA, IL17D, EFNA4, WNT7B, LIF, STAT5A, KRT13, IL17A, CD70, TNFRSF9 
       TNFRSF17, PTGES2, CCRL2, MTRNR2L1, CD53, TWIST2, APOB, WIF1, SLC2A4, LEP 
       CUZD1, TCL1A, KRT20, RAD51, RARG, S100A4, LGALS9, CLEC4E, CTSW, KRT86 
PC_ 2 
Positive:  MPO, LIF, PTGES2, KRT13, IL17A, CCRL2, TNFRSF17, IGHG1, TNFRSF9, IGHG2 
       IL17D, LAIR1, MTRNR2L1, EFNA4, WIF1, STAT5A, WNT7B, PSCA, IGKC, CD70 
       SELENOP, MZB1, S100A4, APOB, LPAR5, XBP1, KRT86, EPHB6, IL20, TLR2 
Negative:  HLA-DRB5, HLA-DQB1, PTPRCAP, LYZ, ITGB2, HLA-DPA1, CD37, KRT15, PTPRC, CXCR4 
       CD52, CD69, CXCR5, HLA-DQA1, NLRC5, IL2RG, CD44, FYB1, CD48, ARHGDIB 
       IL10RA, BTG1, CD68, IL16, ZFP36, MRC1, CD163, CCL5, MZT2A, CD3E 
PC_ 3 
Positive:  MZB1, XBP1, PLA2R1, LPAR5, ATF3, AGR2, CD38, RPS4Y1, DNTT, TNFAIP6 
       ADGRV1, PROKR1, WNT5A, TLR2, COL3A1, VEGFC, TNFRSF13B, JCHAIN, TSLP, COL1A1 
       GAS6, IRF4, THBS2, CCL13, NRIP3, CAV1, FGF12, SERPINB5, TAGLN, SMARCB1 
Negative:  HLA-DPA1, C1QB, HLA-DQA1, C1QC, C1QA, CD53, S100A4, HLA-DRB5, HLA-DQB1, ITGB2 
       LIF, KRT13, PTGES2, STAT5A, CCL5, CCRL2, CD163, TNFRSF9, LYZ, EFNA4 
       MTRNR2L1, FYB1, CD68, LGALS9, TNFRSF17, IL17D, SELENOP, WNT7B, CD2, IL16 
PC_ 4 
Positive:  KRT13, WNT7A, WIF1, TSLP, IGHG2, IGHG1, PTGDR2, TNFRSF9, TNFRSF17, GZMH 
       VEGFC, IL12A, FZD6, FGG, MMP1, IL17D, WNT7B, CXCR5, WNT9A, CD5L 
       LIF, ADGRG5, ADGRA3, MPO, MZB1, XCL2, STAT5A, TNFRSF13B, KRT16, TNFSF9 
Negative:  CSF1R, CLEC4A, RPS4Y1, TLR2, SMARCB1, NRG4, CXCL17, EPHB6, IL12RB1, FYN 
       NOD2, IL20, TWIST1, GDF3, CCL3, TNFAIP6, LUM, PTGIS, RAC2, COL15A1 
       CTLA4, IL15RA, PTGS2, ACKR3, AZU1, CLOCK, WNT5A, CD163, NANOG, ANGPT2 
PC_ 5 
Positive:  MZB1, CD27, XBP1, FYN, CD38, MALAT1, CCL5, MZT2A, FKBP11, IL2RG 
       RAC2, GZMA, CST7, PLAC8, JCHAIN, DUSP5, CCR2, IRF4, CD8A, GAS6 
       ST6GAL1, IL6R, RPS4Y1, HSP90B1, NLRC5, ICOS, IGHA1, CD3E, CCR5, IGHG2 
Negative:  COL1A1, TAGLN, COL3A1, COL1A2, MGP, DCN, LUM, COL6A2, CXCL12, CALD1 
       COL6A3, SELENOP, CD81, BGN, TIMP1, MMP2, C1QA, C1QC, PDGFRA, HGF 
       C1QB, SNAI2, CD163, IGFBP6, SLC40A1, CYP1B1, CD68, MRC2, PTGDS, COL5A2 
12:10:50 UMAP embedding parameters a = 0.9922 b = 1.112
12:10:50 Read 1731 rows and found 20 numeric columns
12:10:50 Using Annoy for neighbor search, n_neighbors = 30
12:10:50 Building Annoy index with metric = cosine, n_trees = 50
0%   10   20   30   40   50   60   70   80   90   100%
[----|----|----|----|----|----|----|----|----|----|
**************************************************|
12:10:50 Writing NN index file to temp file /tmp/RtmpbjSzLh/file4d5f357ac0238
12:10:50 Searching Annoy index using 1 thread, search_k = 3000
12:10:50 Annoy recall = 100%
12:10:51 Commencing smooth kNN distance calibration using 1 thread with target n_neighbors = 30
12:10:52 Initializing from normalized Laplacian + noise (using RSpectra)
12:10:52 Commencing optimization for 500 epochs, with 69420 positive edges
Using method 'umap'
0%   10   20   30   40   50   60   70   80   90   100%
[----|----|----|----|----|----|----|----|----|----|
**************************************************|
12:10:54 Optimization finished
[1] 2.1
Regressing out log10totalcounts

  |                                                                                                                        
  |                                                                                                                  |   0%
  |                                                                                                                        
  |=                                                                                                                 |   1%
  |                                                                                                                        
  |==                                                                                                                |   1%
  |                                                                                                                        
  |==                                                                                                                |   2%
  |                                                                                                                        
  |===                                                                                                               |   2%
  |                                                                                                                        
  |===                                                                                                               |   3%
  |                                                                                                                        
  |====                                                                                                              |   3%
  |                                                                                                                        
  |====                                                                                                              |   4%
  |                                                                                                                        
  |=====                                                                                                             |   4%
  |                                                                                                                        
  |=====                                                                                                             |   5%
  |                                                                                                                        
  |======                                                                                                            |   5%
  |                                                                                                                        
  |======                                                                                                            |   6%
  |                                                                                                                        
  |=======                                                                                                           |   6%
  |                                                                                                                        
  |========                                                                                                          |   7%
  |                                                                                                                        
  |=========                                                                                                         |   8%
  |                                                                                                                        
  |==========                                                                                                        |   8%
  |                                                                                                                        
  |==========                                                                                                        |   9%
  |                                                                                                                        
  |===========                                                                                                       |   9%
  |                                                                                                                        
  |===========                                                                                                       |  10%
  |                                                                                                                        
  |============                                                                                                      |  10%
  |                                                                                                                        
  |============                                                                                                      |  11%
  |                                                                                                                        
  |=============                                                                                                     |  11%
  |                                                                                                                        
  |=============                                                                                                     |  12%
  |                                                                                                                        
  |==============                                                                                                    |  12%
  |                                                                                                                        
  |==============                                                                                                    |  13%
  |                                                                                                                        
  |===============                                                                                                   |  13%
  |                                                                                                                        
  |===============                                                                                                   |  14%
  |                                                                                                                        
  |================                                                                                                  |  14%
  |                                                                                                                        
  |=================                                                                                                 |  15%
  |                                                                                                                        
  |==================                                                                                                |  15%
  |                                                                                                                        
  |==================                                                                                                |  16%
  |                                                                                                                        
  |===================                                                                                               |  16%
  |                                                                                                                        
  |===================                                                                                               |  17%
  |                                                                                                                        
  |====================                                                                                              |  17%
  |                                                                                                                        
  |====================                                                                                              |  18%
  |                                                                                                                        
  |=====================                                                                                             |  18%
  |                                                                                                                        
  |=====================                                                                                             |  19%
  |                                                                                                                        
  |======================                                                                                            |  19%
  |                                                                                                                        
  |======================                                                                                            |  20%
  |                                                                                                                        
  |=======================                                                                                           |  20%
  |                                                                                                                        
  |=======================                                                                                           |  21%
  |                                                                                                                        
  |========================                                                                                          |  21%
  |                                                                                                                        
  |=========================                                                                                         |  22%
  |                                                                                                                        
  |==========================                                                                                        |  23%
  |                                                                                                                        
  |===========================                                                                                       |  23%
  |                                                                                                                        
  |===========================                                                                                       |  24%
  |                                                                                                                        
  |============================                                                                                      |  24%
  |                                                                                                                        
  |============================                                                                                      |  25%
  |                                                                                                                        
  |=============================                                                                                     |  25%
  |                                                                                                                        
  |=============================                                                                                     |  26%
  |                                                                                                                        
  |==============================                                                                                    |  26%
  |                                                                                                                        
  |==============================                                                                                    |  27%
  |                                                                                                                        
  |===============================                                                                                   |  27%
  |                                                                                                                        
  |===============================                                                                                   |  28%
  |                                                                                                                        
  |================================                                                                                  |  28%
  |                                                                                                                        
  |=================================                                                                                 |  29%
  |                                                                                                                        
  |==================================                                                                                |  30%
  |                                                                                                                        
  |===================================                                                                               |  30%
  |                                                                                                                        
  |===================================                                                                               |  31%
  |                                                                                                                        
  |====================================                                                                              |  31%
  |                                                                                                                        
  |====================================                                                                              |  32%
  |                                                                                                                        
  |=====================================                                                                             |  32%
  |                                                                                                                        
  |=====================================                                                                             |  33%
  |                                                                                                                        
  |======================================                                                                            |  33%
  |                                                                                                                        
  |======================================                                                                            |  34%
  |                                                                                                                        
  |=======================================                                                                           |  34%
  |                                                                                                                        
  |=======================================                                                                           |  35%
  |                                                                                                                        
  |========================================                                                                          |  35%
  |                                                                                                                        
  |=========================================                                                                         |  36%
  |                                                                                                                        
  |==========================================                                                                        |  37%
  |                                                                                                                        
  |===========================================                                                                       |  37%
  |                                                                                                                        
  |===========================================                                                                       |  38%
  |                                                                                                                        
  |============================================                                                                      |  38%
  |                                                                                                                        
  |============================================                                                                      |  39%
  |                                                                                                                        
  |=============================================                                                                     |  39%
  |                                                                                                                        
  |=============================================                                                                     |  40%
  |                                                                                                                        
  |==============================================                                                                    |  40%
  |                                                                                                                        
  |==============================================                                                                    |  41%
  |                                                                                                                        
  |===============================================                                                                   |  41%
  |                                                                                                                        
  |===============================================                                                                   |  42%
  |                                                                                                                        
  |================================================                                                                  |  42%
  |                                                                                                                        
  |================================================                                                                  |  43%
  |                                                                                                                        
  |=================================================                                                                 |  43%
  |                                                                                                                        
  |==================================================                                                                |  44%
  |                                                                                                                        
  |===================================================                                                               |  44%
  |                                                                                                                        
  |===================================================                                                               |  45%
  |                                                                                                                        
  |====================================================                                                              |  45%
  |                                                                                                                        
  |====================================================                                                              |  46%
  |                                                                                                                        
  |=====================================================                                                             |  46%
  |                                                                                                                        
  |=====================================================                                                             |  47%
  |                                                                                                                        
  |======================================================                                                            |  47%
  |                                                                                                                        
  |======================================================                                                            |  48%
  |                                                                                                                        
  |=======================================================                                                           |  48%
  |                                                                                                                        
  |=======================================================                                                           |  49%
  |                                                                                                                        
  |========================================================                                                          |  49%
  |                                                                                                                        
  |========================================================                                                          |  50%
  |                                                                                                                        
  |=========================================================                                                         |  50%
  |                                                                                                                        
  |==========================================================                                                        |  50%
  |                                                                                                                        
  |==========================================================                                                        |  51%
  |                                                                                                                        
  |===========================================================                                                       |  51%
  |                                                                                                                        
  |===========================================================                                                       |  52%
  |                                                                                                                        
  |============================================================                                                      |  52%
  |                                                                                                                        
  |============================================================                                                      |  53%
  |                                                                                                                        
  |=============================================================                                                     |  53%
  |                                                                                                                        
  |=============================================================                                                     |  54%
  |                                                                                                                        
  |==============================================================                                                    |  54%
  |                                                                                                                        
  |==============================================================                                                    |  55%
  |                                                                                                                        
  |===============================================================                                                   |  55%
  |                                                                                                                        
  |===============================================================                                                   |  56%
  |                                                                                                                        
  |================================================================                                                  |  56%
  |                                                                                                                        
  |=================================================================                                                 |  57%
  |                                                                                                                        
  |==================================================================                                                |  57%
  |                                                                                                                        
  |==================================================================                                                |  58%
  |                                                                                                                        
  |===================================================================                                               |  58%
  |                                                                                                                        
  |===================================================================                                               |  59%
  |                                                                                                                        
  |====================================================================                                              |  59%
  |                                                                                                                        
  |====================================================================                                              |  60%
  |                                                                                                                        
  |=====================================================================                                             |  60%
  |                                                                                                                        
  |=====================================================================                                             |  61%
  |                                                                                                                        
  |======================================================================                                            |  61%
  |                                                                                                                        
  |======================================================================                                            |  62%
  |                                                                                                                        
  |=======================================================================                                           |  62%
  |                                                                                                                        
  |=======================================================================                                           |  63%
  |                                                                                                                        
  |========================================================================                                          |  63%
  |                                                                                                                        
  |=========================================================================                                         |  64%
  |                                                                                                                        
  |==========================================================================                                        |  65%
  |                                                                                                                        
  |===========================================================================                                       |  65%
  |                                                                                                                        
  |===========================================================================                                       |  66%
  |                                                                                                                        
  |============================================================================                                      |  66%
  |                                                                                                                        
  |============================================================================                                      |  67%
  |                                                                                                                        
  |=============================================================================                                     |  67%
  |                                                                                                                        
  |=============================================================================                                     |  68%
  |                                                                                                                        
  |==============================================================================                                    |  68%
  |                                                                                                                        
  |==============================================================================                                    |  69%
  |                                                                                                                        
  |===============================================================================                                   |  69%
  |                                                                                                                        
  |===============================================================================                                   |  70%
  |                                                                                                                        
  |================================================================================                                  |  70%
  |                                                                                                                        
  |=================================================================================                                 |  71%
  |                                                                                                                        
  |==================================================================================                                |  72%
  |                                                                                                                        
  |===================================================================================                               |  72%
  |                                                                                                                        
  |===================================================================================                               |  73%
  |                                                                                                                        
  |====================================================================================                              |  73%
  |                                                                                                                        
  |====================================================================================                              |  74%
  |                                                                                                                        
  |=====================================================================================                             |  74%
  |                                                                                                                        
  |=====================================================================================                             |  75%
  |                                                                                                                        
  |======================================================================================                            |  75%
  |                                                                                                                        
  |======================================================================================                            |  76%
  |                                                                                                                        
  |=======================================================================================                           |  76%
  |                                                                                                                        
  |=======================================================================================                           |  77%
  |                                                                                                                        
  |========================================================================================                          |  77%
  |                                                                                                                        
  |=========================================================================================                         |  78%
  |                                                                                                                        
  |==========================================================================================                        |  79%
  |                                                                                                                        
  |===========================================================================================                       |  79%
  |                                                                                                                        
  |===========================================================================================                       |  80%
  |                                                                                                                        
  |============================================================================================                      |  80%
  |                                                                                                                        
  |============================================================================================                      |  81%
  |                                                                                                                        
  |=============================================================================================                     |  81%
  |                                                                                                                        
  |=============================================================================================                     |  82%
  |                                                                                                                        
  |==============================================================================================                    |  82%
  |                                                                                                                        
  |==============================================================================================                    |  83%
  |                                                                                                                        
  |===============================================================================================                   |  83%
  |                                                                                                                        
  |===============================================================================================                   |  84%
  |                                                                                                                        
  |================================================================================================                  |  84%
  |                                                                                                                        
  |================================================================================================                  |  85%
  |                                                                                                                        
  |=================================================================================================                 |  85%
  |                                                                                                                        
  |==================================================================================================                |  86%
  |                                                                                                                        
  |===================================================================================================               |  86%
  |                                                                                                                        
  |===================================================================================================               |  87%
  |                                                                                                                        
  |====================================================================================================              |  87%
  |                                                                                                                        
  |====================================================================================================              |  88%
  |                                                                                                                        
  |=====================================================================================================             |  88%
  |                                                                                                                        
  |=====================================================================================================             |  89%
  |                                                                                                                        
  |======================================================================================================            |  89%
  |                                                                                                                        
  |======================================================================================================            |  90%
  |                                                                                                                        
  |=======================================================================================================           |  90%
  |                                                                                                                        
  |=======================================================================================================           |  91%
  |                                                                                                                        
  |========================================================================================================          |  91%
  |                                                                                                                        
  |========================================================================================================          |  92%
  |                                                                                                                        
  |=========================================================================================================         |  92%
  |                                                                                                                        
  |==========================================================================================================        |  93%
  |                                                                                                                        
  |===========================================================================================================       |  94%
  |                                                                                                                        
  |============================================================================================================      |  94%
  |                                                                                                                        
  |============================================================================================================      |  95%
  |                                                                                                                        
  |=============================================================================================================     |  95%
  |                                                                                                                        
  |=============================================================================================================     |  96%
  |                                                                                                                        
  |==============================================================================================================    |  96%
  |                                                                                                                        
  |==============================================================================================================    |  97%
  |                                                                                                                        
  |===============================================================================================================   |  97%
  |                                                                                                                        
  |===============================================================================================================   |  98%
  |                                                                                                                        
  |================================================================================================================  |  98%
  |                                                                                                                        
  |================================================================================================================  |  99%
  |                                                                                                                        
  |================================================================================================================= |  99%
  |                                                                                                                        
  |==================================================================================================================| 100%
Centering and scaling data matrix

  |                                                                                                                        
  |                                                                                                                  |   0%
  |                                                                                                                        
  |==================================================================================================================| 100%
PC_ 1 
Positive:  IGKC, IGHG2, IGHG1, MZT2A, MALAT1, XBP1, MZB1, TYK2, MGP, IFITM1 
       COL3A1, HSP90B1, GPX1, CD38, CALD1, JCHAIN, C1QA, CD81, TAGLN, IFI27 
       RPL34, C1QC, FKBP11, COL1A1, IGHA1, CD27, BST2, TIMP1, LPAR5, IRF4 
Negative:  PSCA, IL17D, EFNA4, WNT7B, STAT5A, LIF, KRT13, IL17A, TNFRSF17, CD70 
       TNFRSF9, PTGES2, TWIST2, MTRNR2L1, SLC2A4, CCRL2, RAD51, TCL1A, LEP, CUZD1 
       CD53, APOB, RARG, KRT20, WIF1, CLEC4E, CTSW, LGALS9, KRT86, WNT9A 
PC_ 2 
Positive:  HLA-DQB1, HLA-DRB5, ITGB2, LYZ, PTPRCAP, HLA-DPA1, PTPRC, HLA-DQA1, CD52, CD37 
       CXCR5, CD163, NLRC5, FYB1, KRT15, CD68, CD69, ARHGDIB, CXCR4, IL2RG 
       BTG1, IL10RA, CCL5, ZFP36, CD48, CD3E, C1QA, TGFB1, IL16, GPR183 
Negative:  MPO, IL17A, LIF, PTGES2, IGHG1, CCRL2, KRT13, TNFRSF17, IGHG2, MTRNR2L1 
       LAIR1, IL17D, TNFRSF9, EFNA4, IGKC, PSCA, WIF1, STAT5A, MZB1, WNT7B 
       CD70, LPAR5, XBP1, APOB, RPS4Y1, KRT86, EPHB6, SELENOP, IL20, TLR2 
PC_ 3 
Positive:  MZB1, XBP1, PLA2R1, ATF3, AGR2, TNFRSF13B, DNTT, CD38, LPAR5, ADGRV1 
       COL1A1, VEGFC, COL3A1, PROKR1, CAV1, GAS6, NRIP3, ADORA2A, FGF12, IRF4 
       CCL13, TNFAIP6, RPS4Y1, CD27, PTGDR2, ST6GAL1, GC, WNT5A, TSLP, MGP 
Negative:  C1QB, HLA-DPA1, HLA-DQA1, C1QC, C1QA, LIF, PTGES2, S100A4, CD53, KRT13 
       HLA-DRB5, HLA-DQB1, ITGB2, STAT5A, CCRL2, EFNA4, MTRNR2L1, CD163, TNFRSF9, CCL5 
       TNFRSF17, LYZ, IL17D, FYB1, LGALS9, CD68, SELENOP, WNT7B, IL17A, CD2 
PC_ 4 
Positive:  CSF1R, CLEC4A, RPS4Y1, CXCL17, SMARCB1, TLR2, NRG4, EPHB6, IL12RB1, FYN 
       NOD2, IL20, TWIST1, LUM, PTGIS, CCL3, GDF3, TNFAIP6, COL15A1, CTLA4 
       RAC2, CLOCK, TIMP1, PTGS2, IL15RA, CD81, AZU1, CD163, NANOG, PLAC8 
Negative:  KRT13, IGHG1, IGHG2, WNT7A, WIF1, TNFRSF17, TSLP, TNFRSF9, PTGDR2, LIF 
       WNT7B, MPO, FZD6, GZMH, MZB1, MMP1, VEGFC, ADGRA3, IL12A, FGG 
       CD5L, IL17D, XBP1, CCRL2, IL17A, CXCR5, GAS6, WNT9A, ADGRG5, TNFRSF13B 
PC_ 5 
Positive:  COL1A1, COL3A1, COL1A2, TAGLN, MGP, LUM, COL6A2, DCN, CALD1, SELENOP 
       COL6A3, CXCL12, BGN, CD81, MMP2, TIMP1, PDGFRA, HGF, C1QB, C1QC 
       C1QA, SLC40A1, SNAI2, CYP1B1, IGFBP6, PTGDS, MRC2, CFD, COL14A1, CD163 
Negative:  CD27, MZB1, FYN, XBP1, CD38, CCL5, RAC2, IL2RG, GZMA, PLAC8 
       RGS1, CST7, RPS4Y1, FKBP11, CXCL17, MALAT1, NLRC5, MZT2A, GAS6, NOD2 
       ST6GAL1, CLOCK, DUSP5, ITGAL, CLEC4A, IGHG2, SEC61G, CCR2, FFAR4, PRSS2 
12:11:12 UMAP embedding parameters a = 0.9922 b = 1.112
12:11:12 Read 1407 rows and found 20 numeric columns
12:11:12 Using Annoy for neighbor search, n_neighbors = 30
12:11:12 Building Annoy index with metric = cosine, n_trees = 50
0%   10   20   30   40   50   60   70   80   90   100%
[----|----|----|----|----|----|----|----|----|----|
**************************************************|
12:11:12 Writing NN index file to temp file /tmp/RtmpbjSzLh/file4d5f31b1326f
12:11:12 Searching Annoy index using 1 thread, search_k = 3000
12:11:13 Annoy recall = 100%
12:11:13 Commencing smooth kNN distance calibration using 1 thread with target n_neighbors = 30
12:11:14 Initializing from normalized Laplacian + noise (using RSpectra)
12:11:14 Commencing optimization for 500 epochs, with 55806 positive edges
Using method 'umap'
0%   10   20   30   40   50   60   70   80   90   100%
[----|----|----|----|----|----|----|----|----|----|
**************************************************|
12:11:16 Optimization finished
[1] 2.2
Regressing out log10totalcounts

  |                                                                                                                        
  |                                                                                                                  |   0%
  |                                                                                                                        
  |=                                                                                                                 |   1%
  |                                                                                                                        
  |==                                                                                                                |   1%
  |                                                                                                                        
  |==                                                                                                                |   2%
  |                                                                                                                        
  |===                                                                                                               |   2%
  |                                                                                                                        
  |===                                                                                                               |   3%
  |                                                                                                                        
  |====                                                                                                              |   3%
  |                                                                                                                        
  |====                                                                                                              |   4%
  |                                                                                                                        
  |=====                                                                                                             |   4%
  |                                                                                                                        
  |=====                                                                                                             |   5%
  |                                                                                                                        
  |======                                                                                                            |   5%
  |                                                                                                                        
  |======                                                                                                            |   6%
  |                                                                                                                        
  |=======                                                                                                           |   6%
  |                                                                                                                        
  |========                                                                                                          |   7%
  |                                                                                                                        
  |=========                                                                                                         |   8%
  |                                                                                                                        
  |==========                                                                                                        |   8%
  |                                                                                                                        
  |==========                                                                                                        |   9%
  |                                                                                                                        
  |===========                                                                                                       |   9%
  |                                                                                                                        
  |===========                                                                                                       |  10%
  |                                                                                                                        
  |============                                                                                                      |  10%
  |                                                                                                                        
  |============                                                                                                      |  11%
  |                                                                                                                        
  |=============                                                                                                     |  11%
  |                                                                                                                        
  |=============                                                                                                     |  12%
  |                                                                                                                        
  |==============                                                                                                    |  12%
  |                                                                                                                        
  |==============                                                                                                    |  13%
  |                                                                                                                        
  |===============                                                                                                   |  13%
  |                                                                                                                        
  |===============                                                                                                   |  14%
  |                                                                                                                        
  |================                                                                                                  |  14%
  |                                                                                                                        
  |=================                                                                                                 |  15%
  |                                                                                                                        
  |==================                                                                                                |  15%
  |                                                                                                                        
  |==================                                                                                                |  16%
  |                                                                                                                        
  |===================                                                                                               |  16%
  |                                                                                                                        
  |===================                                                                                               |  17%
  |                                                                                                                        
  |====================                                                                                              |  17%
  |                                                                                                                        
  |====================                                                                                              |  18%
  |                                                                                                                        
  |=====================                                                                                             |  18%
  |                                                                                                                        
  |=====================                                                                                             |  19%
  |                                                                                                                        
  |======================                                                                                            |  19%
  |                                                                                                                        
  |======================                                                                                            |  20%
  |                                                                                                                        
  |=======================                                                                                           |  20%
  |                                                                                                                        
  |=======================                                                                                           |  21%
  |                                                                                                                        
  |========================                                                                                          |  21%
  |                                                                                                                        
  |=========================                                                                                         |  22%
  |                                                                                                                        
  |==========================                                                                                        |  23%
  |                                                                                                                        
  |===========================                                                                                       |  23%
  |                                                                                                                        
  |===========================                                                                                       |  24%
  |                                                                                                                        
  |============================                                                                                      |  24%
  |                                                                                                                        
  |============================                                                                                      |  25%
  |                                                                                                                        
  |=============================                                                                                     |  25%
  |                                                                                                                        
  |=============================                                                                                     |  26%
  |                                                                                                                        
  |==============================                                                                                    |  26%
  |                                                                                                                        
  |==============================                                                                                    |  27%
  |                                                                                                                        
  |===============================                                                                                   |  27%
  |                                                                                                                        
  |===============================                                                                                   |  28%
  |                                                                                                                        
  |================================                                                                                  |  28%
  |                                                                                                                        
  |=================================                                                                                 |  29%
  |                                                                                                                        
  |==================================                                                                                |  30%
  |                                                                                                                        
  |===================================                                                                               |  30%
  |                                                                                                                        
  |===================================                                                                               |  31%
  |                                                                                                                        
  |====================================                                                                              |  31%
  |                                                                                                                        
  |====================================                                                                              |  32%
  |                                                                                                                        
  |=====================================                                                                             |  32%
  |                                                                                                                        
  |=====================================                                                                             |  33%
  |                                                                                                                        
  |======================================                                                                            |  33%
  |                                                                                                                        
  |======================================                                                                            |  34%
  |                                                                                                                        
  |=======================================                                                                           |  34%
  |                                                                                                                        
  |=======================================                                                                           |  35%
  |                                                                                                                        
  |========================================                                                                          |  35%
  |                                                                                                                        
  |=========================================                                                                         |  36%
  |                                                                                                                        
  |==========================================                                                                        |  37%
  |                                                                                                                        
  |===========================================                                                                       |  37%
  |                                                                                                                        
  |===========================================                                                                       |  38%
  |                                                                                                                        
  |============================================                                                                      |  38%
  |                                                                                                                        
  |============================================                                                                      |  39%
  |                                                                                                                        
  |=============================================                                                                     |  39%
  |                                                                                                                        
  |=============================================                                                                     |  40%
  |                                                                                                                        
  |==============================================                                                                    |  40%
  |                                                                                                                        
  |==============================================                                                                    |  41%
  |                                                                                                                        
  |===============================================                                                                   |  41%
  |                                                                                                                        
  |===============================================                                                                   |  42%
  |                                                                                                                        
  |================================================                                                                  |  42%
  |                                                                                                                        
  |================================================                                                                  |  43%
  |                                                                                                                        
  |=================================================                                                                 |  43%
  |                                                                                                                        
  |==================================================                                                                |  44%
  |                                                                                                                        
  |===================================================                                                               |  44%
  |                                                                                                                        
  |===================================================                                                               |  45%
  |                                                                                                                        
  |====================================================                                                              |  45%
  |                                                                                                                        
  |====================================================                                                              |  46%
  |                                                                                                                        
  |=====================================================                                                             |  46%
  |                                                                                                                        
  |=====================================================                                                             |  47%
  |                                                                                                                        
  |======================================================                                                            |  47%
  |                                                                                                                        
  |======================================================                                                            |  48%
  |                                                                                                                        
  |=======================================================                                                           |  48%
  |                                                                                                                        
  |=======================================================                                                           |  49%
  |                                                                                                                        
  |========================================================                                                          |  49%
  |                                                                                                                        
  |========================================================                                                          |  50%
  |                                                                                                                        
  |=========================================================                                                         |  50%
  |                                                                                                                        
  |==========================================================                                                        |  50%
  |                                                                                                                        
  |==========================================================                                                        |  51%
  |                                                                                                                        
  |===========================================================                                                       |  51%
  |                                                                                                                        
  |===========================================================                                                       |  52%
  |                                                                                                                        
  |============================================================                                                      |  52%
  |                                                                                                                        
  |============================================================                                                      |  53%
  |                                                                                                                        
  |=============================================================                                                     |  53%
  |                                                                                                                        
  |=============================================================                                                     |  54%
  |                                                                                                                        
  |==============================================================                                                    |  54%
  |                                                                                                                        
  |==============================================================                                                    |  55%
  |                                                                                                                        
  |===============================================================                                                   |  55%
  |                                                                                                                        
  |===============================================================                                                   |  56%
  |                                                                                                                        
  |================================================================                                                  |  56%
  |                                                                                                                        
  |=================================================================                                                 |  57%
  |                                                                                                                        
  |==================================================================                                                |  57%
  |                                                                                                                        
  |==================================================================                                                |  58%
  |                                                                                                                        
  |===================================================================                                               |  58%
  |                                                                                                                        
  |===================================================================                                               |  59%
  |                                                                                                                        
  |====================================================================                                              |  59%
  |                                                                                                                        
  |====================================================================                                              |  60%
  |                                                                                                                        
  |=====================================================================                                             |  60%
  |                                                                                                                        
  |=====================================================================                                             |  61%
  |                                                                                                                        
  |======================================================================                                            |  61%
  |                                                                                                                        
  |======================================================================                                            |  62%
  |                                                                                                                        
  |=======================================================================                                           |  62%
  |                                                                                                                        
  |=======================================================================                                           |  63%
  |                                                                                                                        
  |========================================================================                                          |  63%
  |                                                                                                                        
  |=========================================================================                                         |  64%
  |                                                                                                                        
  |==========================================================================                                        |  65%
  |                                                                                                                        
  |===========================================================================                                       |  65%
  |                                                                                                                        
  |===========================================================================                                       |  66%
  |                                                                                                                        
  |============================================================================                                      |  66%
  |                                                                                                                        
  |============================================================================                                      |  67%
  |                                                                                                                        
  |=============================================================================                                     |  67%
  |                                                                                                                        
  |=============================================================================                                     |  68%
  |                                                                                                                        
  |==============================================================================                                    |  68%
  |                                                                                                                        
  |==============================================================================                                    |  69%
  |                                                                                                                        
  |===============================================================================                                   |  69%
  |                                                                                                                        
  |===============================================================================                                   |  70%
  |                                                                                                                        
  |================================================================================                                  |  70%
  |                                                                                                                        
  |=================================================================================                                 |  71%
  |                                                                                                                        
  |==================================================================================                                |  72%
  |                                                                                                                        
  |===================================================================================                               |  72%
  |                                                                                                                        
  |===================================================================================                               |  73%
  |                                                                                                                        
  |====================================================================================                              |  73%
  |                                                                                                                        
  |====================================================================================                              |  74%
  |                                                                                                                        
  |=====================================================================================                             |  74%
  |                                                                                                                        
  |=====================================================================================                             |  75%
  |                                                                                                                        
  |======================================================================================                            |  75%
  |                                                                                                                        
  |======================================================================================                            |  76%
  |                                                                                                                        
  |=======================================================================================                           |  76%
  |                                                                                                                        
  |=======================================================================================                           |  77%
  |                                                                                                                        
  |========================================================================================                          |  77%
  |                                                                                                                        
  |=========================================================================================                         |  78%
  |                                                                                                                        
  |==========================================================================================                        |  79%
  |                                                                                                                        
  |===========================================================================================                       |  79%
  |                                                                                                                        
  |===========================================================================================                       |  80%
  |                                                                                                                        
  |============================================================================================                      |  80%
  |                                                                                                                        
  |============================================================================================                      |  81%
  |                                                                                                                        
  |=============================================================================================                     |  81%
  |                                                                                                                        
  |=============================================================================================                     |  82%
  |                                                                                                                        
  |==============================================================================================                    |  82%
  |                                                                                                                        
  |==============================================================================================                    |  83%
  |                                                                                                                        
  |===============================================================================================                   |  83%
  |                                                                                                                        
  |===============================================================================================                   |  84%
  |                                                                                                                        
  |================================================================================================                  |  84%
  |                                                                                                                        
  |================================================================================================                  |  85%
  |                                                                                                                        
  |=================================================================================================                 |  85%
  |                                                                                                                        
  |==================================================================================================                |  86%
  |                                                                                                                        
  |===================================================================================================               |  86%
  |                                                                                                                        
  |===================================================================================================               |  87%
  |                                                                                                                        
  |====================================================================================================              |  87%
  |                                                                                                                        
  |====================================================================================================              |  88%
  |                                                                                                                        
  |=====================================================================================================             |  88%
  |                                                                                                                        
  |=====================================================================================================             |  89%
  |                                                                                                                        
  |======================================================================================================            |  89%
  |                                                                                                                        
  |======================================================================================================            |  90%
  |                                                                                                                        
  |=======================================================================================================           |  90%
  |                                                                                                                        
  |=======================================================================================================           |  91%
  |                                                                                                                        
  |========================================================================================================          |  91%
  |                                                                                                                        
  |========================================================================================================          |  92%
  |                                                                                                                        
  |=========================================================================================================         |  92%
  |                                                                                                                        
  |==========================================================================================================        |  93%
  |                                                                                                                        
  |===========================================================================================================       |  94%
  |                                                                                                                        
  |============================================================================================================      |  94%
  |                                                                                                                        
  |============================================================================================================      |  95%
  |                                                                                                                        
  |=============================================================================================================     |  95%
  |                                                                                                                        
  |=============================================================================================================     |  96%
  |                                                                                                                        
  |==============================================================================================================    |  96%
  |                                                                                                                        
  |==============================================================================================================    |  97%
  |                                                                                                                        
  |===============================================================================================================   |  97%
  |                                                                                                                        
  |===============================================================================================================   |  98%
  |                                                                                                                        
  |================================================================================================================  |  98%
  |                                                                                                                        
  |================================================================================================================  |  99%
  |                                                                                                                        
  |================================================================================================================= |  99%
  |                                                                                                                        
  |==================================================================================================================| 100%
Centering and scaling data matrix

  |                                                                                                                        
  |                                                                                                                  |   0%
  |                                                                                                                        
  |==================================================================================================================| 100%
PC_ 1 
Positive:  IGHG2, IGKC, IGHG1, MZT2A, MALAT1, XBP1, MZB1, TYK2, IFITM1, MGP 
       COL3A1, HSP90B1, GPX1, CALD1, CD38, C1QA, IFI27, JCHAIN, CD81, RPL34 
       C1QC, TAGLN, FKBP11, COL1A1, IGHA1, BST2, CD27, HLA-DRB5, TIMP1, LPAR5 
Negative:  PSCA, IL17D, EFNA4, STAT5A, WNT7B, LIF, TNFRSF17, IL17A, CD70, KRT13 
       TNFRSF9, TWIST2, SLC2A4, PTGES2, TCL1A, RARG, RAD51, MTRNR2L1, KRT20, WIF1 
       LEP, CTSW, LEFTY2, CLEC4E, CD53, APOB, CCRL2, CUZD1, WNT9A, SCGB3A1 
PC_ 2 
Positive:  HLA-DRB5, HLA-DQB1, ITGB2, LYZ, HLA-DQA1, HLA-DPA1, PTPRCAP, PTPRC, CD68, CXCR5 
       KRT15, CD163, IL10RA, CD52, JAK2, C1QA, FYB1, CD37, CCL5, TNFSF13B 
       MRC1, CD69, ZFP36, IL2RG, ARHGDIB, TNFSF12, BTG1, GZMH, GPR183, NLRC5 
Negative:  MPO, IL17A, PTGES2, LIF, CCRL2, IGHG1, LAIR1, IGHG2, MTRNR2L1, TNFRSF17 
       KRT13, EFNA4, IGKC, IL17D, LPAR5, RPS4Y1, TNFRSF9, PSCA, AZU1, PTGS2 
       EPHB6, WIF1, MZB1, APOB, WNT7B, CD70, TLR2, NRG4, IL20, PTGIS 
PC_ 3 
Positive:  MZB1, XBP1, PLA2R1, TNFRSF13B, DNTT, ATF3, LPAR5, VEGFC, AGR2, CD38 
       PTGDR2, FGF12, IRF4, PROKR1, CAV1, ADORA2A, COL3A1, ARTN, CXCR5, GAS6 
       CCL13, GC, SAA1, ADGRV1, SEC61G, CD27, COL1A1, WNT5A, NRIP3, BGN 
Negative:  C1QB, HLA-DPA1, HLA-DQA1, C1QC, C1QA, PTGES2, S100A4, LIF, CD53, HLA-DQB1 
       HLA-DRB5, EFNA4, KRT13, CCRL2, CD163, STAT5A, ITGB2, MTRNR2L1, TNFRSF9, SELENOP 
       TNFRSF17, LGALS9, CCL5, IL17D, LYZ, CD68, FYB1, WNT7B, CD2, WIF1 
PC_ 4 
Positive:  KRT13, WIF1, TNFRSF17, TNFRSF9, IGHG2, IGHG1, WNT7B, TSLP, MPO, LIF 
       WNT7A, EFNA4, CCRL2, IL17D, PTGES2, FZD6, MZB1, IL17A, PTGDR2, ADGRA3 
       ADGRG5, FGG, MTRNR2L1, STAT5A, GZMH, WNT9A, LAIR1, ST6GAL1, CD5L, IL12A 
Negative:  CSF1R, CLEC4A, CXCL17, RPS4Y1, SMARCB1, TLR2, IL12RB1, FYN, EPHB6, IL20 
       NRG4, NOD2, TWIST1, CCL3, TNFAIP6, LUM, COL15A1, PTGIS, IL15RA, GDF3 
       CD163, CLOCK, RAC2, CD81, PTGS2, NANOG, CTLA4, PLAC8, ACKR3, AZU1 
PC_ 5 
Positive:  COL1A1, COL3A1, COL1A2, MGP, DCN, TAGLN, COL6A2, LUM, CALD1, COL6A3 
       BGN, SELENOP, MMP2, CXCL12, TIMP1, HGF, PDGFRA, CD81, C1QB, C1QC 
       C1QA, CYP1B1, SNAI2, SLC40A1, IGFBP6, MRC2, THBS2, NGFR, BMP5, COL14A1 
Negative:  CD27, FYN, MZB1, XBP1, CCL5, SEC61G, CD38, RAC2, CST7, GAS6 
       GZMA, CD8A, CLOCK, PLAC8, ST6GAL1, NKG7, JCHAIN, PRSS2, MZT2A, FKBP11 
       RPS4Y1, ITGAL, ICOS, DUSP2, DUSP5, IL2RG, IGHA1, HSP90B1, TNFSF14, NOD2 
12:11:31 UMAP embedding parameters a = 0.9922 b = 1.112
12:11:31 Read 1038 rows and found 20 numeric columns
12:11:31 Using Annoy for neighbor search, n_neighbors = 30
12:11:31 Building Annoy index with metric = cosine, n_trees = 50
0%   10   20   30   40   50   60   70   80   90   100%
[----|----|----|----|----|----|----|----|----|----|
**************************************************|
12:11:31 Writing NN index file to temp file /tmp/RtmpbjSzLh/file4d5f353212c37
12:11:31 Searching Annoy index using 1 thread, search_k = 3000
12:11:31 Annoy recall = 100%
12:11:32 Commencing smooth kNN distance calibration using 1 thread with target n_neighbors = 30
12:11:33 Initializing from normalized Laplacian + noise (using RSpectra)
12:11:33 Commencing optimization for 500 epochs, with 40156 positive edges
Using method 'umap'
0%   10   20   30   40   50   60   70   80   90   100%
[----|----|----|----|----|----|----|----|----|----|
**************************************************|
12:11:34 Optimization finished
[1] 2.3
Regressing out log10totalcounts

  |                                                                                                                        
  |                                                                                                                  |   0%
  |                                                                                                                        
  |=                                                                                                                 |   1%
  |                                                                                                                        
  |==                                                                                                                |   1%
  |                                                                                                                        
  |==                                                                                                                |   2%
  |                                                                                                                        
  |===                                                                                                               |   2%
  |                                                                                                                        
  |===                                                                                                               |   3%
  |                                                                                                                        
  |====                                                                                                              |   3%
  |                                                                                                                        
  |====                                                                                                              |   4%
  |                                                                                                                        
  |=====                                                                                                             |   4%
  |                                                                                                                        
  |=====                                                                                                             |   5%
  |                                                                                                                        
  |======                                                                                                            |   5%
  |                                                                                                                        
  |======                                                                                                            |   6%
  |                                                                                                                        
  |=======                                                                                                           |   6%
  |                                                                                                                        
  |========                                                                                                          |   7%
  |                                                                                                                        
  |=========                                                                                                         |   8%
  |                                                                                                                        
  |==========                                                                                                        |   8%
  |                                                                                                                        
  |==========                                                                                                        |   9%
  |                                                                                                                        
  |===========                                                                                                       |   9%
  |                                                                                                                        
  |===========                                                                                                       |  10%
  |                                                                                                                        
  |============                                                                                                      |  10%
  |                                                                                                                        
  |============                                                                                                      |  11%
  |                                                                                                                        
  |=============                                                                                                     |  11%
  |                                                                                                                        
  |=============                                                                                                     |  12%Warning in theta.ml(Y, mu, sum(w), w, limit = control$maxit, trace = control$trace >  :
  iteration limit reached
Warning in theta.ml(Y, mu, sum(w), w, limit = control$maxit, trace = control$trace >  :
  iteration limit reached

  |                                                                                                                        
  |==============                                                                                                    |  12%
  |                                                                                                                        
  |==============                                                                                                    |  13%
  |                                                                                                                        
  |===============                                                                                                   |  13%
  |                                                                                                                        
  |===============                                                                                                   |  14%
  |                                                                                                                        
  |================                                                                                                  |  14%
  |                                                                                                                        
  |=================                                                                                                 |  15%
  |                                                                                                                        
  |==================                                                                                                |  15%
  |                                                                                                                        
  |==================                                                                                                |  16%
  |                                                                                                                        
  |===================                                                                                               |  16%
  |                                                                                                                        
  |===================                                                                                               |  17%
  |                                                                                                                        
  |====================                                                                                              |  17%
  |                                                                                                                        
  |====================                                                                                              |  18%
  |                                                                                                                        
  |=====================                                                                                             |  18%
  |                                                                                                                        
  |=====================                                                                                             |  19%
  |                                                                                                                        
  |======================                                                                                            |  19%
  |                                                                                                                        
  |======================                                                                                            |  20%
  |                                                                                                                        
  |=======================                                                                                           |  20%
  |                                                                                                                        
  |=======================                                                                                           |  21%Warning in theta.ml(Y, mu, sum(w), w, limit = control$maxit, trace = control$trace >  :
  iteration limit reached
Warning in theta.ml(Y, mu, sum(w), w, limit = control$maxit, trace = control$trace >  :
  iteration limit reached

  |                                                                                                                        
  |========================                                                                                          |  21%
  |                                                                                                                        
  |=========================                                                                                         |  22%
  |                                                                                                                        
  |==========================                                                                                        |  23%
  |                                                                                                                        
  |===========================                                                                                       |  23%
  |                                                                                                                        
  |===========================                                                                                       |  24%
  |                                                                                                                        
  |============================                                                                                      |  24%
  |                                                                                                                        
  |============================                                                                                      |  25%
  |                                                                                                                        
  |=============================                                                                                     |  25%
  |                                                                                                                        
  |=============================                                                                                     |  26%
  |                                                                                                                        
  |==============================                                                                                    |  26%
  |                                                                                                                        
  |==============================                                                                                    |  27%
  |                                                                                                                        
  |===============================                                                                                   |  27%
  |                                                                                                                        
  |===============================                                                                                   |  28%
  |                                                                                                                        
  |================================                                                                                  |  28%
  |                                                                                                                        
  |=================================                                                                                 |  29%
  |                                                                                                                        
  |==================================                                                                                |  30%
  |                                                                                                                        
  |===================================                                                                               |  30%
  |                                                                                                                        
  |===================================                                                                               |  31%
  |                                                                                                                        
  |====================================                                                                              |  31%
  |                                                                                                                        
  |====================================                                                                              |  32%
  |                                                                                                                        
  |=====================================                                                                             |  32%
  |                                                                                                                        
  |=====================================                                                                             |  33%
  |                                                                                                                        
  |======================================                                                                            |  33%
  |                                                                                                                        
  |======================================                                                                            |  34%
  |                                                                                                                        
  |=======================================                                                                           |  34%
  |                                                                                                                        
  |=======================================                                                                           |  35%
  |                                                                                                                        
  |========================================                                                                          |  35%
  |                                                                                                                        
  |=========================================                                                                         |  36%
  |                                                                                                                        
  |==========================================                                                                        |  37%
  |                                                                                                                        
  |===========================================                                                                       |  37%
  |                                                                                                                        
  |===========================================                                                                       |  38%
  |                                                                                                                        
  |============================================                                                                      |  38%
  |                                                                                                                        
  |============================================                                                                      |  39%
  |                                                                                                                        
  |=============================================                                                                     |  39%
  |                                                                                                                        
  |=============================================                                                                     |  40%
  |                                                                                                                        
  |==============================================                                                                    |  40%
  |                                                                                                                        
  |==============================================                                                                    |  41%
  |                                                                                                                        
  |===============================================                                                                   |  41%
  |                                                                                                                        
  |===============================================                                                                   |  42%
  |                                                                                                                        
  |================================================                                                                  |  42%
  |                                                                                                                        
  |================================================                                                                  |  43%
  |                                                                                                                        
  |=================================================                                                                 |  43%
  |                                                                                                                        
  |==================================================                                                                |  44%
  |                                                                                                                        
  |===================================================                                                               |  44%
  |                                                                                                                        
  |===================================================                                                               |  45%
  |                                                                                                                        
  |====================================================                                                              |  45%
  |                                                                                                                        
  |====================================================                                                              |  46%
  |                                                                                                                        
  |=====================================================                                                             |  46%
  |                                                                                                                        
  |=====================================================                                                             |  47%
  |                                                                                                                        
  |======================================================                                                            |  47%
  |                                                                                                                        
  |======================================================                                                            |  48%
  |                                                                                                                        
  |=======================================================                                                           |  48%
  |                                                                                                                        
  |=======================================================                                                           |  49%
  |                                                                                                                        
  |========================================================                                                          |  49%
  |                                                                                                                        
  |========================================================                                                          |  50%
  |                                                                                                                        
  |=========================================================                                                         |  50%
  |                                                                                                                        
  |==========================================================                                                        |  50%
  |                                                                                                                        
  |==========================================================                                                        |  51%
  |                                                                                                                        
  |===========================================================                                                       |  51%
  |                                                                                                                        
  |===========================================================                                                       |  52%
  |                                                                                                                        
  |============================================================                                                      |  52%
  |                                                                                                                        
  |============================================================                                                      |  53%
  |                                                                                                                        
  |=============================================================                                                     |  53%
  |                                                                                                                        
  |=============================================================                                                     |  54%
  |                                                                                                                        
  |==============================================================                                                    |  54%
  |                                                                                                                        
  |==============================================================                                                    |  55%
  |                                                                                                                        
  |===============================================================                                                   |  55%
  |                                                                                                                        
  |===============================================================                                                   |  56%
  |                                                                                                                        
  |================================================================                                                  |  56%
  |                                                                                                                        
  |=================================================================                                                 |  57%
  |                                                                                                                        
  |==================================================================                                                |  57%
  |                                                                                                                        
  |==================================================================                                                |  58%
  |                                                                                                                        
  |===================================================================                                               |  58%
  |                                                                                                                        
  |===================================================================                                               |  59%
  |                                                                                                                        
  |====================================================================                                              |  59%
  |                                                                                                                        
  |====================================================================                                              |  60%
  |                                                                                                                        
  |=====================================================================                                             |  60%
  |                                                                                                                        
  |=====================================================================                                             |  61%
  |                                                                                                                        
  |======================================================================                                            |  61%
  |                                                                                                                        
  |======================================================================                                            |  62%
  |                                                                                                                        
  |=======================================================================                                           |  62%
  |                                                                                                                        
  |=======================================================================                                           |  63%
  |                                                                                                                        
  |========================================================================                                          |  63%
  |                                                                                                                        
  |=========================================================================                                         |  64%
  |                                                                                                                        
  |==========================================================================                                        |  65%
  |                                                                                                                        
  |===========================================================================                                       |  65%
  |                                                                                                                        
  |===========================================================================                                       |  66%
  |                                                                                                                        
  |============================================================================                                      |  66%
  |                                                                                                                        
  |============================================================================                                      |  67%
  |                                                                                                                        
  |=============================================================================                                     |  67%
  |                                                                                                                        
  |=============================================================================                                     |  68%
  |                                                                                                                        
  |==============================================================================                                    |  68%
  |                                                                                                                        
  |==============================================================================                                    |  69%
  |                                                                                                                        
  |===============================================================================                                   |  69%
  |                                                                                                                        
  |===============================================================================                                   |  70%
  |                                                                                                                        
  |================================================================================                                  |  70%
  |                                                                                                                        
  |=================================================================================                                 |  71%
  |                                                                                                                        
  |==================================================================================                                |  72%
  |                                                                                                                        
  |===================================================================================                               |  72%
  |                                                                                                                        
  |===================================================================================                               |  73%
  |                                                                                                                        
  |====================================================================================                              |  73%
  |                                                                                                                        
  |====================================================================================                              |  74%
  |                                                                                                                        
  |=====================================================================================                             |  74%
  |                                                                                                                        
  |=====================================================================================                             |  75%
  |                                                                                                                        
  |======================================================================================                            |  75%
  |                                                                                                                        
  |======================================================================================                            |  76%
  |                                                                                                                        
  |=======================================================================================                           |  76%
  |                                                                                                                        
  |=======================================================================================                           |  77%
  |                                                                                                                        
  |========================================================================================                          |  77%
  |                                                                                                                        
  |=========================================================================================                         |  78%
  |                                                                                                                        
  |==========================================================================================                        |  79%
  |                                                                                                                        
  |===========================================================================================                       |  79%
  |                                                                                                                        
  |===========================================================================================                       |  80%
  |                                                                                                                        
  |============================================================================================                      |  80%
  |                                                                                                                        
  |============================================================================================                      |  81%
  |                                                                                                                        
  |=============================================================================================                     |  81%
  |                                                                                                                        
  |=============================================================================================                     |  82%
  |                                                                                                                        
  |==============================================================================================                    |  82%
  |                                                                                                                        
  |==============================================================================================                    |  83%
  |                                                                                                                        
  |===============================================================================================                   |  83%
  |                                                                                                                        
  |===============================================================================================                   |  84%
  |                                                                                                                        
  |================================================================================================                  |  84%
  |                                                                                                                        
  |================================================================================================                  |  85%
  |                                                                                                                        
  |=================================================================================================                 |  85%
  |                                                                                                                        
  |==================================================================================================                |  86%
  |                                                                                                                        
  |===================================================================================================               |  86%
  |                                                                                                                        
  |===================================================================================================               |  87%
  |                                                                                                                        
  |====================================================================================================              |  87%
  |                                                                                                                        
  |====================================================================================================              |  88%
  |                                                                                                                        
  |=====================================================================================================             |  88%
  |                                                                                                                        
  |=====================================================================================================             |  89%
  |                                                                                                                        
  |======================================================================================================            |  89%
  |                                                                                                                        
  |======================================================================================================            |  90%
  |                                                                                                                        
  |=======================================================================================================           |  90%
  |                                                                                                                        
  |=======================================================================================================           |  91%
  |                                                                                                                        
  |========================================================================================================          |  91%
  |                                                                                                                        
  |========================================================================================================          |  92%
  |                                                                                                                        
  |=========================================================================================================         |  92%
  |                                                                                                                        
  |==========================================================================================================        |  93%
  |                                                                                                                        
  |===========================================================================================================       |  94%
  |                                                                                                                        
  |============================================================================================================      |  94%
  |                                                                                                                        
  |============================================================================================================      |  95%
  |                                                                                                                        
  |=============================================================================================================     |  95%
  |                                                                                                                        
  |=============================================================================================================     |  96%
  |                                                                                                                        
  |==============================================================================================================    |  96%
  |                                                                                                                        
  |==============================================================================================================    |  97%
  |                                                                                                                        
  |===============================================================================================================   |  97%
  |                                                                                                                        
  |===============================================================================================================   |  98%
  |                                                                                                                        
  |================================================================================================================  |  98%
  |                                                                                                                        
  |================================================================================================================  |  99%
  |                                                                                                                        
  |================================================================================================================= |  99%
  |                                                                                                                        
  |==================================================================================================================| 100%
Centering and scaling data matrix

  |                                                                                                                        
  |                                                                                                                  |   0%
  |                                                                                                                        
  |==================================================================================================================| 100%
PC_ 1 
Positive:  IGKC, IGHG2, IGHG1, MZT2A, MALAT1, XBP1, MZB1, TYK2, IFITM1, MGP 
       COL3A1, GPX1, CALD1, HSP90B1, RPL34, C1QA, CD38, CD81, FKBP11, IFI27 
       JCHAIN, C1QC, COL1A1, TAGLN, IGHA1, BST2, CD27, LPAR5, TIMP1, HLA-DRB5 
Negative:  PSCA, IL17D, EFNA4, WNT7B, STAT5A, IL17A, CD70, TNFRSF17, KRT13, LIF 
       SCGB3A1, TCL1A, TWIST2, RAD51, TNFRSF9, KRT20, RARG, SLC2A4, MTRNR2L1, PTGES2 
       LEP, CCRL2, IFNA1, CTSW, WNT9A, TNFSF15, WIF1, CLEC4E, CD53, PROKR1 
PC_ 2 
Positive:  HLA-DRB5, LYZ, ITGB2, HLA-DQB1, HLA-DQA1, PTPRCAP, CD52, HLA-DPA1, CXCR5, JAK2 
       KRT15, PTPRC, IL10RA, GPR183, TNFSF13B, CD68, CD163, CD69, C1QA, NLRC5 
       TNFSF12, GZMH, IL2RG, OAS3, FGG, NKG7, CD48, MRC1, IL2RB, CD37 
Negative:  MPO, LAIR1, PTGES2, IL17A, CCRL2, LIF, MTRNR2L1, KRT13, IL20, TNFRSF17 
       AZU1, IGHG1, EFNA4, RPS4Y1, APOB, IL12RB1, PTGS2, EPHB6, IGHG2, TLR2 
       CD70, LPAR5, NRG4, PSCA, IGKC, WIF1, IL17D, PTGIS, TNFRSF9, ELANE 
PC_ 3 
Positive:  MZB1, XBP1, PLA2R1, TNFRSF13B, AGR2, GAS6, PTGDR2, VEGFC, LPAR5, ATF3 
       DNTT, ARTN, TSLP, CD38, FKBP11, ADORA2A, CAV1, COL3A1, FGF12, UCP1 
       COL1A1, CCL13, WNT7A, ST6GAL1, IRF4, TAGLN, ESR1, CSF2RB, ACTG2, LCN2 
Negative:  C1QB, HLA-DPA1, C1QC, HLA-DQA1, C1QA, ITGB2, HLA-DQB1, HLA-DRB5, CD163, CD53 
       S100A4, LIF, PTGES2, CCL5, EFNA4, LYZ, CD68, CCRL2, STAT5A, LGALS9 
       FYB1, MTRNR2L1, KRT13, SELENOP, CD2, GPX1, TNFRSF9, IL17D, PTGDS, SRGN 
PC_ 4 
Positive:  KRT13, WIF1, TNFRSF9, EFNA4, LIF, TNFRSF17, IGHG2, PTGES2, IGHG1, IL17D 
       WNT7B, CCRL2, IL17A, S100A4, MTRNR2L1, ADGRG5, MPO, TSLP, WNT7A, CD70 
       STAT5A, FGG, FZD6, CXCR6, TCL1A, MMP1, IL12A, TWIST2, LAIR1, GZMH 
Negative:  CSF1R, CLEC4A, CXCL17, FYN, TLR2, RPS4Y1, SMARCB1, TWIST1, NRG4, IL20 
       NOD2, EPHB6, IL12RB1, CTLA4, IL15RA, CCL3, RAC2, NANOG, CLOCK, TNFAIP6 
       LUM, PTGS2, COL15A1, LY6D, RGS1, ALCAM, PLAC8, GDF3, AZU1, CD44 
PC_ 5 
Positive:  CD27, MZB1, CCL5, CD38, XBP1, ST6GAL1, GAS6, CD79A, DUSP5, CST7 
       TNFSF14, FYN, RAC2, IL2RG, GZMA, ICOS, JCHAIN, IGHG2, SEC61G, AZU1 
       PRSS2, FKBP11, IL6R, CD8A, CSF2RB, CFLAR, PTPRCAP, CCR5, CD48, CLOCK 
Negative:  COL3A1, COL1A1, COL1A2, COL6A2, MGP, TAGLN, DCN, LUM, CALD1, BGN 
       COL6A3, CXCL12, TIMP1, CD81, MMP2, SELENOP, PDGFRA, HGF, C1QC, C1QA 
       SNAI2, C1QB, SLC40A1, CYP1B1, TLR4, HDAC4, COL14A1, CD163, RSPO2, PTGDS 
12:11:45 UMAP embedding parameters a = 0.9922 b = 1.112
12:11:45 Read 704 rows and found 20 numeric columns
12:11:45 Using Annoy for neighbor search, n_neighbors = 30
12:11:45 Building Annoy index with metric = cosine, n_trees = 50
0%   10   20   30   40   50   60   70   80   90   100%
[----|----|----|----|----|----|----|----|----|----|
**************************************************|
12:11:45 Writing NN index file to temp file /tmp/RtmpbjSzLh/file4d5f36b925262
12:11:45 Searching Annoy index using 1 thread, search_k = 3000
12:11:45 Annoy recall = 100%
12:11:46 Commencing smooth kNN distance calibration using 1 thread with target n_neighbors = 30
12:11:47 Initializing from normalized Laplacian + noise (using RSpectra)
12:11:47 Commencing optimization for 500 epochs, with 26686 positive edges
Using method 'umap'
0%   10   20   30   40   50   60   70   80   90   100%
[----|----|----|----|----|----|----|----|----|----|
**************************************************|
12:11:48 Optimization finished
[1] 2.4
Regressing out log10totalcounts

  |                                                                                                                        
  |                                                                                                                  |   0%
  |                                                                                                                        
  |=                                                                                                                 |   1%
  |                                                                                                                        
  |==                                                                                                                |   1%
  |                                                                                                                        
  |==                                                                                                                |   2%
  |                                                                                                                        
  |===                                                                                                               |   2%
  |                                                                                                                        
  |===                                                                                                               |   3%
  |                                                                                                                        
  |====                                                                                                              |   3%
  |                                                                                                                        
  |====                                                                                                              |   4%
  |                                                                                                                        
  |=====                                                                                                             |   4%
  |                                                                                                                        
  |=====                                                                                                             |   5%
  |                                                                                                                        
  |======                                                                                                            |   5%
  |                                                                                                                        
  |======                                                                                                            |   6%
  |                                                                                                                        
  |=======                                                                                                           |   6%
  |                                                                                                                        
  |========                                                                                                          |   7%
  |                                                                                                                        
  |=========                                                                                                         |   8%
  |                                                                                                                        
  |==========                                                                                                        |   8%
  |                                                                                                                        
  |==========                                                                                                        |   9%
  |                                                                                                                        
  |===========                                                                                                       |   9%
  |                                                                                                                        
  |===========                                                                                                       |  10%
  |                                                                                                                        
  |============                                                                                                      |  10%
  |                                                                                                                        
  |============                                                                                                      |  11%
  |                                                                                                                        
  |=============                                                                                                     |  11%
  |                                                                                                                        
  |=============                                                                                                     |  12%Warning in theta.ml(Y, mu, sum(w), w, limit = control$maxit, trace = control$trace >  :
  iteration limit reached
Warning in theta.ml(Y, mu, sum(w), w, limit = control$maxit, trace = control$trace >  :
  iteration limit reached

  |                                                                                                                        
  |==============                                                                                                    |  12%
  |                                                                                                                        
  |==============                                                                                                    |  13%
  |                                                                                                                        
  |===============                                                                                                   |  13%
  |                                                                                                                        
  |===============                                                                                                   |  14%
  |                                                                                                                        
  |================                                                                                                  |  14%
  |                                                                                                                        
  |=================                                                                                                 |  15%
  |                                                                                                                        
  |==================                                                                                                |  15%
  |                                                                                                                        
  |==================                                                                                                |  16%
  |                                                                                                                        
  |===================                                                                                               |  16%
  |                                                                                                                        
  |===================                                                                                               |  17%
  |                                                                                                                        
  |====================                                                                                              |  17%
  |                                                                                                                        
  |====================                                                                                              |  18%
  |                                                                                                                        
  |=====================                                                                                             |  18%
  |                                                                                                                        
  |=====================                                                                                             |  19%
  |                                                                                                                        
  |======================                                                                                            |  19%
  |                                                                                                                        
  |======================                                                                                            |  20%
  |                                                                                                                        
  |=======================                                                                                           |  20%
  |                                                                                                                        
  |=======================                                                                                           |  21%Warning in theta.ml(Y, mu, sum(w), w, limit = control$maxit, trace = control$trace >  :
  iteration limit reached
Warning in theta.ml(Y, mu, sum(w), w, limit = control$maxit, trace = control$trace >  :
  iteration limit reached

  |                                                                                                                        
  |========================                                                                                          |  21%
  |                                                                                                                        
  |=========================                                                                                         |  22%
  |                                                                                                                        
  |==========================                                                                                        |  23%
  |                                                                                                                        
  |===========================                                                                                       |  23%
  |                                                                                                                        
  |===========================                                                                                       |  24%
  |                                                                                                                        
  |============================                                                                                      |  24%
  |                                                                                                                        
  |============================                                                                                      |  25%
  |                                                                                                                        
  |=============================                                                                                     |  25%
  |                                                                                                                        
  |=============================                                                                                     |  26%
  |                                                                                                                        
  |==============================                                                                                    |  26%
  |                                                                                                                        
  |==============================                                                                                    |  27%
  |                                                                                                                        
  |===============================                                                                                   |  27%
  |                                                                                                                        
  |===============================                                                                                   |  28%
  |                                                                                                                        
  |================================                                                                                  |  28%
  |                                                                                                                        
  |=================================                                                                                 |  29%
  |                                                                                                                        
  |==================================                                                                                |  30%
  |                                                                                                                        
  |===================================                                                                               |  30%
  |                                                                                                                        
  |===================================                                                                               |  31%
  |                                                                                                                        
  |====================================                                                                              |  31%
  |                                                                                                                        
  |====================================                                                                              |  32%
  |                                                                                                                        
  |=====================================                                                                             |  32%
  |                                                                                                                        
  |=====================================                                                                             |  33%
  |                                                                                                                        
  |======================================                                                                            |  33%
  |                                                                                                                        
  |======================================                                                                            |  34%
  |                                                                                                                        
  |=======================================                                                                           |  34%
  |                                                                                                                        
  |=======================================                                                                           |  35%
  |                                                                                                                        
  |========================================                                                                          |  35%
  |                                                                                                                        
  |=========================================                                                                         |  36%
  |                                                                                                                        
  |==========================================                                                                        |  37%
  |                                                                                                                        
  |===========================================                                                                       |  37%
  |                                                                                                                        
  |===========================================                                                                       |  38%
  |                                                                                                                        
  |============================================                                                                      |  38%
  |                                                                                                                        
  |============================================                                                                      |  39%
  |                                                                                                                        
  |=============================================                                                                     |  39%
  |                                                                                                                        
  |=============================================                                                                     |  40%
  |                                                                                                                        
  |==============================================                                                                    |  40%
  |                                                                                                                        
  |==============================================                                                                    |  41%Warning in theta.ml(Y, mu, sum(w), w, limit = control$maxit, trace = control$trace >  :
  iteration limit reached
Warning in theta.ml(Y, mu, sum(w), w, limit = control$maxit, trace = control$trace >  :
  iteration limit reached

  |                                                                                                                        
  |===============================================                                                                   |  41%
  |                                                                                                                        
  |===============================================                                                                   |  42%
  |                                                                                                                        
  |================================================                                                                  |  42%
  |                                                                                                                        
  |================================================                                                                  |  43%
  |                                                                                                                        
  |=================================================                                                                 |  43%
  |                                                                                                                        
  |==================================================                                                                |  44%
  |                                                                                                                        
  |===================================================                                                               |  44%
  |                                                                                                                        
  |===================================================                                                               |  45%
  |                                                                                                                        
  |====================================================                                                              |  45%
  |                                                                                                                        
  |====================================================                                                              |  46%
  |                                                                                                                        
  |=====================================================                                                             |  46%
  |                                                                                                                        
  |=====================================================                                                             |  47%Warning in theta.ml(Y, mu, sum(w), w, limit = control$maxit, trace = control$trace >  :
  iteration limit reached
Warning in theta.ml(Y, mu, sum(w), w, limit = control$maxit, trace = control$trace >  :
  iteration limit reached

  |                                                                                                                        
  |======================================================                                                            |  47%
  |                                                                                                                        
  |======================================================                                                            |  48%
  |                                                                                                                        
  |=======================================================                                                           |  48%
  |                                                                                                                        
  |=======================================================                                                           |  49%
  |                                                                                                                        
  |========================================================                                                          |  49%Warning in theta.ml(Y, mu, sum(w), w, limit = control$maxit, trace = control$trace >  :
  iteration limit reached
Warning in theta.ml(Y, mu, sum(w), w, limit = control$maxit, trace = control$trace >  :
  iteration limit reached

  |                                                                                                                        
  |========================================================                                                          |  50%
  |                                                                                                                        
  |=========================================================                                                         |  50%
  |                                                                                                                        
  |==========================================================                                                        |  50%
  |                                                                                                                        
  |==========================================================                                                        |  51%Warning in theta.ml(Y, mu, sum(w), w, limit = control$maxit, trace = control$trace >  :
  iteration limit reached
Warning in sqrt(1/i) : NaNs produced
Warning in theta.ml(Y, mu, sum(w), w, limit = control$maxit, trace = control$trace >  :
  iteration limit reached
Warning in sqrt(1/i) : NaNs produced

  |                                                                                                                        
  |===========================================================                                                       |  51%
  |                                                                                                                        
  |===========================================================                                                       |  52%
  |                                                                                                                        
  |============================================================                                                      |  52%
  |                                                                                                                        
  |============================================================                                                      |  53%
  |                                                                                                                        
  |=============================================================                                                     |  53%
  |                                                                                                                        
  |=============================================================                                                     |  54%
  |                                                                                                                        
  |==============================================================                                                    |  54%
  |                                                                                                                        
  |==============================================================                                                    |  55%
  |                                                                                                                        
  |===============================================================                                                   |  55%
  |                                                                                                                        
  |===============================================================                                                   |  56%
  |                                                                                                                        
  |================================================================                                                  |  56%
  |                                                                                                                        
  |=================================================================                                                 |  57%
  |                                                                                                                        
  |==================================================================                                                |  57%
  |                                                                                                                        
  |==================================================================                                                |  58%
  |                                                                                                                        
  |===================================================================                                               |  58%
  |                                                                                                                        
  |===================================================================                                               |  59%
  |                                                                                                                        
  |====================================================================                                              |  59%
  |                                                                                                                        
  |====================================================================                                              |  60%
  |                                                                                                                        
  |=====================================================================                                             |  60%
  |                                                                                                                        
  |=====================================================================                                             |  61%
  |                                                                                                                        
  |======================================================================                                            |  61%Warning in theta.ml(Y, mu, sum(w), w, limit = control$maxit, trace = control$trace >  :
  iteration limit reached
Warning in theta.ml(Y, mu, sum(w), w, limit = control$maxit, trace = control$trace >  :
  iteration limit reached

  |                                                                                                                        
  |======================================================================                                            |  62%
  |                                                                                                                        
  |=======================================================================                                           |  62%
  |                                                                                                                        
  |=======================================================================                                           |  63%
  |                                                                                                                        
  |========================================================================                                          |  63%
  |                                                                                                                        
  |=========================================================================                                         |  64%
  |                                                                                                                        
  |==========================================================================                                        |  65%
  |                                                                                                                        
  |===========================================================================                                       |  65%
  |                                                                                                                        
  |===========================================================================                                       |  66%
  |                                                                                                                        
  |============================================================================                                      |  66%
  |                                                                                                                        
  |============================================================================                                      |  67%
  |                                                                                                                        
  |=============================================================================                                     |  67%
  |                                                                                                                        
  |=============================================================================                                     |  68%
  |                                                                                                                        
  |==============================================================================                                    |  68%
  |                                                                                                                        
  |==============================================================================                                    |  69%
  |                                                                                                                        
  |===============================================================================                                   |  69%
  |                                                                                                                        
  |===============================================================================                                   |  70%
  |                                                                                                                        
  |================================================================================                                  |  70%
  |                                                                                                                        
  |=================================================================================                                 |  71%
  |                                                                                                                        
  |==================================================================================                                |  72%
  |                                                                                                                        
  |===================================================================================                               |  72%
  |                                                                                                                        
  |===================================================================================                               |  73%
  |                                                                                                                        
  |====================================================================================                              |  73%
  |                                                                                                                        
  |====================================================================================                              |  74%
  |                                                                                                                        
  |=====================================================================================                             |  74%
  |                                                                                                                        
  |=====================================================================================                             |  75%
  |                                                                                                                        
  |======================================================================================                            |  75%
  |                                                                                                                        
  |======================================================================================                            |  76%
  |                                                                                                                        
  |=======================================================================================                           |  76%
  |                                                                                                                        
  |=======================================================================================                           |  77%
  |                                                                                                                        
  |========================================================================================                          |  77%
  |                                                                                                                        
  |=========================================================================================                         |  78%
  |                                                                                                                        
  |==========================================================================================                        |  79%
  |                                                                                                                        
  |===========================================================================================                       |  79%
  |                                                                                                                        
  |===========================================================================================                       |  80%
  |                                                                                                                        
  |============================================================================================                      |  80%
  |                                                                                                                        
  |============================================================================================                      |  81%
  |                                                                                                                        
  |=============================================================================================                     |  81%
  |                                                                                                                        
  |=============================================================================================                     |  82%
  |                                                                                                                        
  |==============================================================================================                    |  82%
  |                                                                                                                        
  |==============================================================================================                    |  83%
  |                                                                                                                        
  |===============================================================================================                   |  83%
  |                                                                                                                        
  |===============================================================================================                   |  84%
  |                                                                                                                        
  |================================================================================================                  |  84%
  |                                                                                                                        
  |================================================================================================                  |  85%
  |                                                                                                                        
  |=================================================================================================                 |  85%
  |                                                                                                                        
  |==================================================================================================                |  86%
  |                                                                                                                        
  |===================================================================================================               |  86%
  |                                                                                                                        
  |===================================================================================================               |  87%
  |                                                                                                                        
  |====================================================================================================              |  87%
  |                                                                                                                        
  |====================================================================================================              |  88%
  |                                                                                                                        
  |=====================================================================================================             |  88%
  |                                                                                                                        
  |=====================================================================================================             |  89%
  |                                                                                                                        
  |======================================================================================================            |  89%
  |                                                                                                                        
  |======================================================================================================            |  90%
  |                                                                                                                        
  |=======================================================================================================           |  90%
  |                                                                                                                        
  |=======================================================================================================           |  91%
  |                                                                                                                        
  |========================================================================================================          |  91%
  |                                                                                                                        
  |========================================================================================================          |  92%
  |                                                                                                                        
  |=========================================================================================================         |  92%Warning in theta.ml(Y, mu, sum(w), w, limit = control$maxit, trace = control$trace >  :
  iteration limit reached
Warning in theta.ml(Y, mu, sum(w), w, limit = control$maxit, trace = control$trace >  :
  iteration limit reached

  |                                                                                                                        
  |==========================================================================================================        |  93%Warning in theta.ml(Y, mu, sum(w), w, limit = control$maxit, trace = control$trace >  :
  iteration limit reached
Warning in theta.ml(Y, mu, sum(w), w, limit = control$maxit, trace = control$trace >  :
  iteration limit reached

  |                                                                                                                        
  |===========================================================================================================       |  94%
  |                                                                                                                        
  |============================================================================================================      |  94%
  |                                                                                                                        
  |============================================================================================================      |  95%
  |                                                                                                                        
  |=============================================================================================================     |  95%
  |                                                                                                                        
  |=============================================================================================================     |  96%
  |                                                                                                                        
  |==============================================================================================================    |  96%
  |                                                                                                                        
  |==============================================================================================================    |  97%
  |                                                                                                                        
  |===============================================================================================================   |  97%
  |                                                                                                                        
  |===============================================================================================================   |  98%
  |                                                                                                                        
  |================================================================================================================  |  98%
  |                                                                                                                        
  |================================================================================================================  |  99%
  |                                                                                                                        
  |================================================================================================================= |  99%
  |                                                                                                                        
  |==================================================================================================================| 100%
Centering and scaling data matrix

  |                                                                                                                        
  |                                                                                                                  |   0%
  |                                                                                                                        
  |==================================================================================================================| 100%
PC_ 1 
Positive:  IGKC, IGHG1, IGHG2, MZT2A, MALAT1, XBP1, MZB1, TYK2, MGP, IFITM1 
       CALD1, RPL34, HSP90B1, GPX1, COL3A1, FKBP11, C1QA, CD81, CD38, COL1A1 
       C1QC, JCHAIN, TAGLN, LPAR5, IFI27, IGHA1, BST2, CD27, HLA-DRB5, TIMP1 
Negative:  PSCA, CD70, IL17D, EFNA4, SCGB3A1, STAT5A, CLEC4E, TCL1A, SLC2A4, RARG 
       RAD51, TNFRSF17, WNT7B, IL17A, KRT20, CIDEA, KRT13, DDR2, LEP, TNFSF15 
       LIF, ADGRA3, WNT9A, TWIST2, PROKR1, HDAC3, QRFPR, STAT4, CLEC4A, ATG5 
PC_ 2 
Positive:  HLA-DQA1, LYZ, ITGB2, KRT15, HLA-DRB5, WNT7A, JAK2, PTPRCAP, HLA-DQB1, CXCR5 
       PTPRC, CD69, C1QA, GZMH, NKG7, GZMK, OAS3, CASP8, HLA-DPA1, IL2RG 
       IL10RA, TNFRSF18, FGG, CST7, TGFB1, OASL, IL2RB, CD163, VHL, OAS1 
Negative:  RPS4Y1, MPO, AZU1, CLEC4A, IL20, EPHB6, SMARCB1, LAIR1, PTGIS, TLR2 
       NRG4, CXCL17, CCRL2, PTGS2, ADGRF4, IL12RB1, PTGES2, CSF1R, NOD2, SOSTDC1 
       APOB, NANOG, KRT86, CTLA4, IL17D, CLOCK, LPAR5, ANGPT2, COL5A1, WNT5A 
PC_ 3 
Positive:  HLA-DPA1, C1QB, HLA-DQA1, HLA-DQB1, C1QC, ITGB2, LIF, C1QA, HLA-DRB5, CD163 
       LYZ, CCL5, S100A4, CD53, CCRL2, LGALS9, EFNA4, STAT5A, CD68, FYB1 
       PTGES2, CD3E, TNFRSF9, GPX1, CD2, FYN, IL17D, MTRNR2L1, SRGN, CSF1R 
Negative:  MZB1, XBP1, COL3A1, TNFRSF13B, TSLP, FGF12, WNT7A, PTGDR2, BGN, PLA2R1 
       ATF3, COL1A1, TAGLN, ARTN, RSPO2, VEGFC, CALD1, MGP, EFNB3, GAS6 
       DNTT, TNFSF9, CCL28, FKBP11, SAA1, IRF4, ATM, TNFSF13B, LPAR5, DMBT1 
PC_ 4 
Positive:  IGHG2, IGHG1, DUSP5, WIF1, GZMA, CCL5, GZMK, PTPRCAP, CD8A, TNFRSF17 
       MPO, CCRL2, CXCR6, CCR5, CD79A, CD47, CD48, TNFSF14, COL9A2, ST6GAL1 
       IL17A, ITGAL, XBP1, ATG12, TCL1A, MTRNR2L1, CD3E, IL2RG, NKG7, KRT13 
Negative:  COL3A1, MGP, TAGLN, COL1A1, LUM, COL1A2, CALD1, CD81, C1QC, TIMP1 
       COL6A2, CD163, C1QA, PDGFRA, TLR4, HGF, BGN, MMP2, IFI27, DCN 
       CSF1R, C1QB, CD68, SRGN, CLEC7A, IFNGR1, MS4A4A, IFITM1, GPX1, CMKLR1 
PC_ 5 
Positive:  TLR2, CSF1R, CXCL17, NOD2, FYN, PLAC8, CCL3, CLEC4A, CUZD1, IL12RB1 
       PRSS2, CLOCK, RAC2, IL15RA, CST7, PTGS2, IGHM, CXCR4, IL3RA, KRT1 
       TAP1, GDF3, IL20, AZU1, RGS1, IL6, TWIST1, RPS4Y1, TNFAIP6, ATM 
Negative:  SELENOP, DCN, KRT13, EFNA4, PTGES2, COL6A2, CCRL2, TNFRSF9, S100A4, COL1A2 
       MGP, WIF1, COL1A1, WNT7A, COL6A3, COL3A1, SNAI2, LIF, CXCL12, TCL1A 
       TAGLN, IL17D, TWIST2, MTRNR2L1, FGG, C1QB, BGN, CIDEA, CD70, WNT7B 
12:11:56 UMAP embedding parameters a = 0.9922 b = 1.112
12:11:56 Read 420 rows and found 20 numeric columns
12:11:56 Using Annoy for neighbor search, n_neighbors = 30
12:11:56 Building Annoy index with metric = cosine, n_trees = 50
0%   10   20   30   40   50   60   70   80   90   100%
[----|----|----|----|----|----|----|----|----|----|
**************************************************|
12:11:56 Writing NN index file to temp file /tmp/RtmpbjSzLh/file4d5f35753f9b6
12:11:56 Searching Annoy index using 1 thread, search_k = 3000
12:11:56 Annoy recall = 100%
12:11:57 Commencing smooth kNN distance calibration using 1 thread with target n_neighbors = 30
12:11:58 Initializing from normalized Laplacian + noise (using RSpectra)
12:11:58 Commencing optimization for 500 epochs, with 15338 positive edges
Using method 'umap'
0%   10   20   30   40   50   60   70   80   90   100%
[----|----|----|----|----|----|----|----|----|----|
**************************************************|
12:11:59 Optimization finished
[1] 2.5
Regressing out log10totalcounts

  |                                                                                                                        
  |                                                                                                                  |   0%
  |                                                                                                                        
  |=                                                                                                                 |   1%
  |                                                                                                                        
  |==                                                                                                                |   1%
  |                                                                                                                        
  |==                                                                                                                |   2%
  |                                                                                                                        
  |===                                                                                                               |   2%
  |                                                                                                                        
  |===                                                                                                               |   3%
  |                                                                                                                        
  |====                                                                                                              |   3%
  |                                                                                                                        
  |====                                                                                                              |   4%
  |                                                                                                                        
  |=====                                                                                                             |   4%
  |                                                                                                                        
  |=====                                                                                                             |   5%
  |                                                                                                                        
  |======                                                                                                            |   5%
  |                                                                                                                        
  |======                                                                                                            |   6%
  |                                                                                                                        
  |=======                                                                                                           |   6%Warning in theta.ml(Y, mu, sum(w), w, limit = control$maxit, trace = control$trace >  :
  iteration limit reached
Warning in theta.ml(Y, mu, sum(w), w, limit = control$maxit, trace = control$trace >  :
  iteration limit reached
Warning in theta.ml(Y, mu, sum(w), w, limit = control$maxit, trace = control$trace >  :
  iteration limit reached
Warning in theta.ml(Y, mu, sum(w), w, limit = control$maxit, trace = control$trace >  :
  iteration limit reached

  |                                                                                                                        
  |========                                                                                                          |   7%Warning in theta.ml(Y, mu, sum(w), w, limit = control$maxit, trace = control$trace >  :
  iteration limit reached
Warning in theta.ml(Y, mu, sum(w), w, limit = control$maxit, trace = control$trace >  :
  iteration limit reached

  |                                                                                                                        
  |=========                                                                                                         |   8%
  |                                                                                                                        
  |==========                                                                                                        |   8%
  |                                                                                                                        
  |==========                                                                                                        |   9%
  |                                                                                                                        
  |===========                                                                                                       |   9%
  |                                                                                                                        
  |===========                                                                                                       |  10%
  |                                                                                                                        
  |============                                                                                                      |  10%
  |                                                                                                                        
  |============                                                                                                      |  11%
  |                                                                                                                        
  |=============                                                                                                     |  11%
  |                                                                                                                        
  |=============                                                                                                     |  12%Warning in theta.ml(Y, mu, sum(w), w, limit = control$maxit, trace = control$trace >  :
  iteration limit reached
Warning in theta.ml(Y, mu, sum(w), w, limit = control$maxit, trace = control$trace >  :
  iteration limit reached

  |                                                                                                                        
  |==============                                                                                                    |  12%
  |                                                                                                                        
  |==============                                                                                                    |  13%Warning in theta.ml(Y, mu, sum(w), w, limit = control$maxit, trace = control$trace >  :
  iteration limit reached
Warning in theta.ml(Y, mu, sum(w), w, limit = control$maxit, trace = control$trace >  :
  iteration limit reached

  |                                                                                                                        
  |===============                                                                                                   |  13%
  |                                                                                                                        
  |===============                                                                                                   |  14%
  |                                                                                                                        
  |================                                                                                                  |  14%Warning in theta.ml(Y, mu, sum(w), w, limit = control$maxit, trace = control$trace >  :
  iteration limit reached
Warning in theta.ml(Y, mu, sum(w), w, limit = control$maxit, trace = control$trace >  :
  iteration limit reached

  |                                                                                                                        
  |=================                                                                                                 |  15%
  |                                                                                                                        
  |==================                                                                                                |  15%
  |                                                                                                                        
  |==================                                                                                                |  16%
  |                                                                                                                        
  |===================                                                                                               |  16%
  |                                                                                                                        
  |===================                                                                                               |  17%Warning in theta.ml(Y, mu, sum(w), w, limit = control$maxit, trace = control$trace >  :
  iteration limit reached
Warning in theta.ml(Y, mu, sum(w), w, limit = control$maxit, trace = control$trace >  :
  iteration limit reached

  |                                                                                                                        
  |====================                                                                                              |  17%
  |                                                                                                                        
  |====================                                                                                              |  18%
  |                                                                                                                        
  |=====================                                                                                             |  18%
  |                                                                                                                        
  |=====================                                                                                             |  19%
  |                                                                                                                        
  |======================                                                                                            |  19%
  |                                                                                                                        
  |======================                                                                                            |  20%
  |                                                                                                                        
  |=======================                                                                                           |  20%
  |                                                                                                                        
  |=======================                                                                                           |  21%Warning in theta.ml(Y, mu, sum(w), w, limit = control$maxit, trace = control$trace >  :
  iteration limit reached
Warning in theta.ml(Y, mu, sum(w), w, limit = control$maxit, trace = control$trace >  :
  iteration limit reached

  |                                                                                                                        
  |========================                                                                                          |  21%
  |                                                                                                                        
  |=========================                                                                                         |  22%
  |                                                                                                                        
  |==========================                                                                                        |  23%Warning in theta.ml(Y, mu, sum(w), w, limit = control$maxit, trace = control$trace >  :
  iteration limit reached
Warning in theta.ml(Y, mu, sum(w), w, limit = control$maxit, trace = control$trace >  :
  iteration limit reached

  |                                                                                                                        
  |===========================                                                                                       |  23%
  |                                                                                                                        
  |===========================                                                                                       |  24%
  |                                                                                                                        
  |============================                                                                                      |  24%
  |                                                                                                                        
  |============================                                                                                      |  25%
  |                                                                                                                        
  |=============================                                                                                     |  25%
  |                                                                                                                        
  |=============================                                                                                     |  26%
  |                                                                                                                        
  |==============================                                                                                    |  26%
  |                                                                                                                        
  |==============================                                                                                    |  27%
  |                                                                                                                        
  |===============================                                                                                   |  27%
  |                                                                                                                        
  |===============================                                                                                   |  28%
  |                                                                                                                        
  |================================                                                                                  |  28%
  |                                                                                                                        
  |=================================                                                                                 |  29%
  |                                                                                                                        
  |==================================                                                                                |  30%
  |                                                                                                                        
  |===================================                                                                               |  30%
  |                                                                                                                        
  |===================================                                                                               |  31%
  |                                                                                                                        
  |====================================                                                                              |  31%
  |                                                                                                                        
  |====================================                                                                              |  32%
  |                                                                                                                        
  |=====================================                                                                             |  32%
  |                                                                                                                        
  |=====================================                                                                             |  33%
  |                                                                                                                        
  |======================================                                                                            |  33%
  |                                                                                                                        
  |======================================                                                                            |  34%
  |                                                                                                                        
  |=======================================                                                                           |  34%
  |                                                                                                                        
  |=======================================                                                                           |  35%
  |                                                                                                                        
  |========================================                                                                          |  35%
  |                                                                                                                        
  |=========================================                                                                         |  36%
  |                                                                                                                        
  |==========================================                                                                        |  37%
  |                                                                                                                        
  |===========================================                                                                       |  37%
  |                                                                                                                        
  |===========================================                                                                       |  38%
  |                                                                                                                        
  |============================================                                                                      |  38%
  |                                                                                                                        
  |============================================                                                                      |  39%Warning in theta.ml(Y, mu, sum(w), w, limit = control$maxit, trace = control$trace >  :
  iteration limit reached
Warning in theta.ml(Y, mu, sum(w), w, limit = control$maxit, trace = control$trace >  :
  iteration limit reached

  |                                                                                                                        
  |=============================================                                                                     |  39%
  |                                                                                                                        
  |=============================================                                                                     |  40%
  |                                                                                                                        
  |==============================================                                                                    |  40%
  |                                                                                                                        
  |==============================================                                                                    |  41%Warning in theta.ml(Y, mu, sum(w), w, limit = control$maxit, trace = control$trace >  :
  iteration limit reached
Warning in theta.ml(Y, mu, sum(w), w, limit = control$maxit, trace = control$trace >  :
  iteration limit reached

  |                                                                                                                        
  |===============================================                                                                   |  41%
  |                                                                                                                        
  |===============================================                                                                   |  42%
  |                                                                                                                        
  |================================================                                                                  |  42%
  |                                                                                                                        
  |================================================                                                                  |  43%
  |                                                                                                                        
  |=================================================                                                                 |  43%
  |                                                                                                                        
  |==================================================                                                                |  44%Warning in theta.ml(Y, mu, sum(w), w, limit = control$maxit, trace = control$trace >  :
  iteration limit reached
Warning in theta.ml(Y, mu, sum(w), w, limit = control$maxit, trace = control$trace >  :
  iteration limit reached

  |                                                                                                                        
  |===================================================                                                               |  44%
  |                                                                                                                        
  |===================================================                                                               |  45%
  |                                                                                                                        
  |====================================================                                                              |  45%
  |                                                                                                                        
  |====================================================                                                              |  46%
  |                                                                                                                        
  |=====================================================                                                             |  46%
  |                                                                                                                        
  |=====================================================                                                             |  47%
  |                                                                                                                        
  |======================================================                                                            |  47%
  |                                                                                                                        
  |======================================================                                                            |  48%
  |                                                                                                                        
  |=======================================================                                                           |  48%
  |                                                                                                                        
  |=======================================================                                                           |  49%
  |                                                                                                                        
  |========================================================                                                          |  49%Warning in theta.ml(Y, mu, sum(w), w, limit = control$maxit, trace = control$trace >  :
  iteration limit reached
Warning in theta.ml(Y, mu, sum(w), w, limit = control$maxit, trace = control$trace >  :
  iteration limit reached

  |                                                                                                                        
  |========================================================                                                          |  50%
  |                                                                                                                        
  |=========================================================                                                         |  50%
  |                                                                                                                        
  |==========================================================                                                        |  50%
  |                                                                                                                        
  |==========================================================                                                        |  51%Warning in theta.ml(Y, mu, sum(w), w, limit = control$maxit, trace = control$trace >  :
  iteration limit reached
Warning in sqrt(1/i) : NaNs produced
Warning in theta.ml(Y, mu, sum(w), w, limit = control$maxit, trace = control$trace >  :
  iteration limit reached
Warning in sqrt(1/i) : NaNs produced

  |                                                                                                                        
  |===========================================================                                                       |  51%
  |                                                                                                                        
  |===========================================================                                                       |  52%
  |                                                                                                                        
  |============================================================                                                      |  52%
  |                                                                                                                        
  |============================================================                                                      |  53%
  |                                                                                                                        
  |=============================================================                                                     |  53%
  |                                                                                                                        
  |=============================================================                                                     |  54%
  |                                                                                                                        
  |==============================================================                                                    |  54%
  |                                                                                                                        
  |==============================================================                                                    |  55%
  |                                                                                                                        
  |===============================================================                                                   |  55%
  |                                                                                                                        
  |===============================================================                                                   |  56%
  |                                                                                                                        
  |================================================================                                                  |  56%
  |                                                                                                                        
  |=================================================================                                                 |  57%
  |                                                                                                                        
  |==================================================================                                                |  57%
  |                                                                                                                        
  |==================================================================                                                |  58%
  |                                                                                                                        
  |===================================================================                                               |  58%
  |                                                                                                                        
  |===================================================================                                               |  59%
  |                                                                                                                        
  |====================================================================                                              |  59%
  |                                                                                                                        
  |====================================================================                                              |  60%
  |                                                                                                                        
  |=====================================================================                                             |  60%
  |                                                                                                                        
  |=====================================================================                                             |  61%
  |                                                                                                                        
  |======================================================================                                            |  61%Warning in theta.ml(Y, mu, sum(w), w, limit = control$maxit, trace = control$trace >  :
  iteration limit reached
Warning in theta.ml(Y, mu, sum(w), w, limit = control$maxit, trace = control$trace >  :
  iteration limit reached
Warning in glm.nb(formula = fmla, data = regression.mat) :
  alternation limit reached

  |                                                                                                                        
  |======================================================================                                            |  62%
  |                                                                                                                        
  |=======================================================================                                           |  62%
  |                                                                                                                        
  |=======================================================================                                           |  63%
  |                                                                                                                        
  |========================================================================                                          |  63%
  |                                                                                                                        
  |=========================================================================                                         |  64%Warning in theta.ml(Y, mu, sum(w), w, limit = control$maxit, trace = control$trace >  :
  iteration limit reached
Warning in theta.ml(Y, mu, sum(w), w, limit = control$maxit, trace = control$trace >  :
  iteration limit reached

  |                                                                                                                        
  |==========================================================================                                        |  65%Warning in theta.ml(Y, mu, sum(w), w, limit = control$maxit, trace = control$trace >  :
  iteration limit reached
Warning in theta.ml(Y, mu, sum(w), w, limit = control$maxit, trace = control$trace >  :
  iteration limit reached

  |                                                                                                                        
  |===========================================================================                                       |  65%
  |                                                                                                                        
  |===========================================================================                                       |  66%
  |                                                                                                                        
  |============================================================================                                      |  66%
  |                                                                                                                        
  |============================================================================                                      |  67%
  |                                                                                                                        
  |=============================================================================                                     |  67%
  |                                                                                                                        
  |=============================================================================                                     |  68%
  |                                                                                                                        
  |==============================================================================                                    |  68%
  |                                                                                                                        
  |==============================================================================                                    |  69%
  |                                                                                                                        
  |===============================================================================                                   |  69%
  |                                                                                                                        
  |===============================================================================                                   |  70%
  |                                                                                                                        
  |================================================================================                                  |  70%
  |                                                                                                                        
  |=================================================================================                                 |  71%Warning in theta.ml(Y, mu, sum(w), w, limit = control$maxit, trace = control$trace >  :
  iteration limit reached
Warning in theta.ml(Y, mu, sum(w), w, limit = control$maxit, trace = control$trace >  :
  iteration limit reached

  |                                                                                                                        
  |==================================================================================                                |  72%
  |                                                                                                                        
  |===================================================================================                               |  72%
  |                                                                                                                        
  |===================================================================================                               |  73%
  |                                                                                                                        
  |====================================================================================                              |  73%
  |                                                                                                                        
  |====================================================================================                              |  74%
  |                                                                                                                        
  |=====================================================================================                             |  74%
  |                                                                                                                        
  |=====================================================================================                             |  75%
  |                                                                                                                        
  |======================================================================================                            |  75%
  |                                                                                                                        
  |======================================================================================                            |  76%
  |                                                                                                                        
  |=======================================================================================                           |  76%Warning in theta.ml(Y, mu, sum(w), w, limit = control$maxit, trace = control$trace >  :
  iteration limit reached
Warning in theta.ml(Y, mu, sum(w), w, limit = control$maxit, trace = control$trace >  :
  iteration limit reached

  |                                                                                                                        
  |=======================================================================================                           |  77%
  |                                                                                                                        
  |========================================================================================                          |  77%
  |                                                                                                                        
  |=========================================================================================                         |  78%
  |                                                                                                                        
  |==========================================================================================                        |  79%
  |                                                                                                                        
  |===========================================================================================                       |  79%
  |                                                                                                                        
  |===========================================================================================                       |  80%
  |                                                                                                                        
  |============================================================================================                      |  80%
  |                                                                                                                        
  |============================================================================================                      |  81%
  |                                                                                                                        
  |=============================================================================================                     |  81%
  |                                                                                                                        
  |=============================================================================================                     |  82%
  |                                                                                                                        
  |==============================================================================================                    |  82%
  |                                                                                                                        
  |==============================================================================================                    |  83%
  |                                                                                                                        
  |===============================================================================================                   |  83%
  |                                                                                                                        
  |===============================================================================================                   |  84%
  |                                                                                                                        
  |================================================================================================                  |  84%
  |                                                                                                                        
  |================================================================================================                  |  85%
  |                                                                                                                        
  |=================================================================================================                 |  85%
  |                                                                                                                        
  |==================================================================================================                |  86%
  |                                                                                                                        
  |===================================================================================================               |  86%
  |                                                                                                                        
  |===================================================================================================               |  87%
  |                                                                                                                        
  |====================================================================================================              |  87%
  |                                                                                                                        
  |====================================================================================================              |  88%
  |                                                                                                                        
  |=====================================================================================================             |  88%
  |                                                                                                                        
  |=====================================================================================================             |  89%
  |                                                                                                                        
  |======================================================================================================            |  89%
  |                                                                                                                        
  |======================================================================================================            |  90%
  |                                                                                                                        
  |=======================================================================================================           |  90%
  |                                                                                                                        
  |=======================================================================================================           |  91%
  |                                                                                                                        
  |========================================================================================================          |  91%
  |                                                                                                                        
  |========================================================================================================          |  92%
  |                                                                                                                        
  |=========================================================================================================         |  92%Warning in theta.ml(Y, mu, sum(w), w, limit = control$maxit, trace = control$trace >  :
  iteration limit reached
Warning in theta.ml(Y, mu, sum(w), w, limit = control$maxit, trace = control$trace >  :
  iteration limit reached

  |                                                                                                                        
  |==========================================================================================================        |  93%Warning in theta.ml(Y, mu, sum(w), w, limit = control$maxit, trace = control$trace >  :
  iteration limit reached
Warning in theta.ml(Y, mu, sum(w), w, limit = control$maxit, trace = control$trace >  :
  iteration limit reached

  |                                                                                                                        
  |===========================================================================================================       |  94%
  |                                                                                                                        
  |============================================================================================================      |  94%
  |                                                                                                                        
  |============================================================================================================      |  95%
  |                                                                                                                        
  |=============================================================================================================     |  95%
  |                                                                                                                        
  |=============================================================================================================     |  96%Warning in theta.ml(Y, mu, sum(w), w, limit = control$maxit, trace = control$trace >  :
  iteration limit reached
Warning in theta.ml(Y, mu, sum(w), w, limit = control$maxit, trace = control$trace >  :
  iteration limit reached

  |                                                                                                                        
  |==============================================================================================================    |  96%
  |                                                                                                                        
  |==============================================================================================================    |  97%
  |                                                                                                                        
  |===============================================================================================================   |  97%
  |                                                                                                                        
  |===============================================================================================================   |  98%
  |                                                                                                                        
  |================================================================================================================  |  98%
  |                                                                                                                        
  |================================================================================================================  |  99%
  |                                                                                                                        
  |================================================================================================================= |  99%
  |                                                                                                                        
  |==================================================================================================================| 100%
Centering and scaling data matrix

  |                                                                                                                        
  |                                                                                                                  |   0%
  |                                                                                                                        
  |==================================================================================================================| 100%
PC_ 1 
Positive:  IGKC, IGHG2, IGHG1, MZT2A, MALAT1, XBP1, MZB1, TYK2, IFITM1, GPX1 
       HSP90B1, FKBP11, COL3A1, CALD1, MGP, RPL34, C1QA, CD81, C1QC, COL1A1 
       TAGLN, CD38, LPAR5, JCHAIN, IFI27, IGHA1, HLA-DRB5, HLA-DPA1, TIMP1, ITGB2 
Negative:  PSCA, CD70, EFNA4, IL17D, RAD51, DDR2, SCGB3A1, TCL1A, TNFRSF17, HDAC3 
       STAT5A, CIDEA, CLEC4E, CSF3R, KRT20, SLC2A4, FGG, QRFPR, IL12A, CLEC4A 
       LEP, WNT7B, TWIST2, RARG, CUZD1, NRG4, IL17A, KRT13, STAT4, LIF 
PC_ 2 
Positive:  PTGIS, RPS4Y1, PTGES2, EPHB6, IL20, NRG4, AZU1, MPO, CXCL17, CCRL2 
       TLR2, EFNA4, ST6GALNAC3, ADGRF4, IL12RB1, IL17D, NOD2, SMARCB1, G6PC2, LAIR1 
       ANGPT2, IL33, KRT86, DNMT1, CLEC4A, RPL32, COL5A1, CSF1R, LAMP3, CD79A 
Negative:  WNT7A, KRT15, JAK2, TNFSF9, FGG, CXCR5, CD80, NLRP3, ZFP36, CD5L 
       TNFSF13B, VEGFC, MMP1, ADGRG3, ATF3, GZMH, NPPC, PTGDR2, TNFRSF13B, OAS1 
       VHL, FGF12, TNFSF18, TLR7, PTPRCAP, MRC1, CASP8, FOXP3, RELT, CHGA 
PC_ 3 
Positive:  MZB1, TSLP, TAGLN, XBP1, PLA2R1, IGHG2, ATF3, COL3A1, IGKC, AGR2 
       WNT7A, COL1A1, MPO, LPAR5, RSPO2, TNFRSF13B, IGHG1, COL6A3, LUM, DMBT1 
       ARTN, FGG, ADGRL1, EFNB3, DCN, ESR1, SLPI, ADGRB2, UCP1, CALD1 
Negative:  HLA-DPA1, ITGB2, HLA-DQB1, CD2, HLA-DQA1, HLA-DRB5, CCL5, FYB1, CD163, CD3E 
       LYZ, C1QC, CLEC2D, CCL19, CD68, CSK, IL16, CD44, MZT2A, CST7 
       NLRC5, KLRK1, FYN, C1QA, PTPRCAP, TYK2, GZMK, CXCR4, BTG1, C1QB 
PC_ 4 
Positive:  CXCR6, WIF1, KRT13, EFNA4, CCRL2, S100A4, TNFRSF9, LIF, SELENOP, MTRNR2L1 
       STAT5A, IL17D, PTGES2, TWIST2, TNFRSF17, FGF7, TCL1A, PSCA, C1QB, WNT7B 
       IL12A, LGALS9, CD70, CLEC4D, IL17A, TGFB1, RARG, CLEC12A, CPA3, SNAI2 
Negative:  CSF1R, TWIST1, TLR2, NOD2, APOA1, KRT4, CLEC4A, IFI27, KRT20, CXCL17 
       ITGAM, SELL, PLAC8, IL15RA, CUZD1, CSK, G6PC2, RAC2, ATM, GPBAR1 
       TNFAIP6, CSF2RA, IFITM1, MERTK, FFAR3, ACKR1, FCRLA, TNFSF15, RGS2, GC 
PC_ 5 
Positive:  COL3A1, MGP, COL1A1, COL1A2, COL6A2, LUM, TAGLN, CALD1, C1QC, DCN 
       BGN, TIMP1, C1QA, MMP2, SELENOP, COL6A3, C1QB, CD163, MMP19, HGF 
       PDGFRA, SRGN, CLEC7A, CD81, TLR4, NLRP3, CXCL12, CD68, DHRS2, CMKLR1 
Negative:  IL2RG, IGHG2, IGHG1, DUSP5, ST6GAL1, ADGRV1, PTPRCAP, FYN, CD38, GDF3 
       PDCD1, AZU1, NLRC5, CD52, CLOCK, TLR2, GZMK, ATG12, ANGPT2, UBE2C 
       RAC2, GDNF, NOD2, CD28, CHEK2, UCP1, TOX, ITGAL, CD48, GAS6 
12:12:04 UMAP embedding parameters a = 0.9922 b = 1.112
12:12:04 Read 218 rows and found 20 numeric columns
12:12:04 Using Annoy for neighbor search, n_neighbors = 30
12:12:04 Building Annoy index with metric = cosine, n_trees = 50
0%   10   20   30   40   50   60   70   80   90   100%
[----|----|----|----|----|----|----|----|----|----|
**************************************************|
12:12:04 Writing NN index file to temp file /tmp/RtmpbjSzLh/file4d5f37a40314e
12:12:04 Searching Annoy index using 1 thread, search_k = 3000
12:12:04 Annoy recall = 100%
12:12:05 Commencing smooth kNN distance calibration using 1 thread with target n_neighbors = 30
12:12:06 Initializing from normalized Laplacian + noise (using RSpectra)
12:12:06 Commencing optimization for 500 epochs, with 7832 positive edges
Using method 'umap'
0%   10   20   30   40   50   60   70   80   90   100%
[----|----|----|----|----|----|----|----|----|----|
**************************************************|
12:12:06 Optimization finished
[[1]]

[[2]]

[[3]]

[[4]]

[[5]]

[[6]]

[[7]]

[[8]]

[[9]]

[[10]]

[[11]]

cells with > 80 RNA counts seem to do best

Plot UMAP

#filter by ncounts
bcell_seurat_fil <- subset(bcell_seurat, subset = log10totalcounts > 1.9)

#run UMAP
bcell_seurat_fil <- RunPCA(bcell_seurat_fil, features = bcell_all.genes, npcs=20)
PC_ 1 
Positive:  MARCO, CCL7, CLEC4D, MMP3, RSPO2, IL36G, FOXP3, GDNF, MMP1, GPER1 
       LY75, IFNL3, IFNG, ACKR1, CAMP, NLRC4, PGF, IAPP, CYP19A1, INHBB 
       EFNB3, VPREB3, IGHA1, ADGRV1, ADGRB3, KRT5, CD8B, COL5A2, KRT6B, CHGA 
Negative:  CD53, S100A4, STAT5A, IL17D, PTGES2, TNFRSF17, LIF, IL16, SELENOP, LAIR1 
       LGALS9, MPO, WNT7B, CD70, BTG1, RPL32, WIF1, IL15RA, TNFRSF9, PSCA 
       MKI67, TYROBP, CD28, CCRL2, EFNA4, MTRNR2L1, CYTOR, RAC2, ARHGDIB, IL17A 
PC_ 2 
Positive:  PSCA, KRT13, LIF, IL17D, IL17A, WNT7B, EFNA4, TNFRSF9, CCRL2, TNFRSF17 
       STAT5A, PTGES2, CD70, MTRNR2L1, APOB, WIF1, LEP, TWIST2, KRT86, KRT20 
       CUZD1, ADGRF4, RAD51, GDF3, MPO, IL20, OLR1, LEFTY2, SLC2A4, ELANE 
Negative:  XBP1, COL3A1, IFI27, MZB1, GPX1, MGP, IFITM1, C1QA, CD81, C1QC 
       CALD1, CD38, RPL34, TAGLN, JCHAIN, CD163, BST2, HLA-DRB5, MALAT1, CD27 
       HSP90B1, COL1A1, IGKC, ITGB2, FKBP11, CXCR4, SRGN, TIMP1, TYK2, HMGB2 
PC_ 3 
Positive:  SERPINB5, PROKR1, ATF3, DNTT, VEGFC, TNFRSF13B, CXCR5, NLRP2, NRIP3, ACTG2 
       FGG, CCL13, MMP3, TNFSF13B, WNT5B, BMP6, CCL28, GC, AATK, ADORA2A 
       EFNB3, FGF12, GDNF, AGR2, DMBT1, ADGRV1, TCL1A, LINC02446, COL9A3, SLC2A4 
Negative:  LIF, KRT13, PTGES2, CCRL2, S100A4, C1QB, STAT5A, TNFRSF17, TNFRSF9, MTRNR2L1 
       CD53, EFNA4, IL17A, IL17D, MPO, WNT7B, LGALS9, HLA-DQA1, SELENOP, WIF1 
       CD70, C1QA, HLA-DPA1, C1QC, LAIR1, PSCA, ITGB2, CD163, CCL5, HLA-DRB5 
PC_ 4 
Positive:  CCL5, GZMK, PTPRCAP, HLA-DQA1, FYB1, NKG7, CD52, HLA-DPA1, HLA-DQB1, LYZ 
       CD84, CD2, CD3E, ITGB2, NLRC5, CD69, CST7, PRF1, GZMH, PDCD1 
       PTPRC, CD37, KLRK1, GZMB, OASL, IL16, CD44, IL2RG, LAG3, IL2RB 
Negative:  MZB1, XBP1, COL3A1, TLR2, LPAR5, IGKC, RPS4Y1, MGP, PTGS2, TAGLN 
       COL1A1, JCHAIN, IGHG2, CD38, COL5A1, IGHG1, LUM, SMARCB1, TNFAIP6, CLEC4A 
       HSP90B1, EPHB6, BGN, WNT5A, CALD1, HGF, COL1A2, NRG4, CXCL17, MPO 
PC_ 5 
Positive:  KRT13, TSLP, TNFRSF17, PTGDR2, MPO, WIF1, WNT7B, LIF, VEGFC, WNT7A 
       IL17D, XBP1, TNFRSF9, COL1A1, STAT5A, COL3A1, MZB1, MMP1, SNAI2, EFNA4 
       ADGRA3, FZD6, TAGLN, NRIP3, COL1A2, IL17A, DMBT1, CD5L, IGHG2, LAIR1 
Negative:  CLEC4A, FYN, IL12RB1, CSF1R, RPS4Y1, NRG4, SMARCB1, CXCL17, EPHB6, GDF3 
       NOD2, TWIST1, IL20, CCL5, CCL3, ACKR3, TLR2, TNFAIP6, PLAC8, CTLA4 
       PTGIS, CLOCK, CD2, RAC2, RGS1, AZU1, COL15A1, CXCR4, IL7R, FYB1 
bcell_seurat_fil <- RunUMAP(bcell_seurat_fil, dims = 1:20)
12:12:08 UMAP embedding parameters a = 0.9922 b = 1.112
12:12:08 Read 2040 rows and found 20 numeric columns
12:12:08 Using Annoy for neighbor search, n_neighbors = 30
12:12:08 Building Annoy index with metric = cosine, n_trees = 50
0%   10   20   30   40   50   60   70   80   90   100%
[----|----|----|----|----|----|----|----|----|----|
**************************************************|
12:12:09 Writing NN index file to temp file /tmp/RtmpbjSzLh/file4d5f36da3b31d
12:12:09 Searching Annoy index using 1 thread, search_k = 3000
12:12:09 Annoy recall = 100%
12:12:10 Commencing smooth kNN distance calibration using 1 thread with target n_neighbors = 30
12:12:11 Initializing from normalized Laplacian + noise (using RSpectra)
12:12:11 Commencing optimization for 500 epochs, with 85384 positive edges
Using method 'umap'
0%   10   20   30   40   50   60   70   80   90   100%
[----|----|----|----|----|----|----|----|----|----|
**************************************************|
12:12:13 Optimization finished
Idents(object = bcell_seurat_fil) <- bcell_seurat_fil@meta.data$'bcell_subclust' 

# remove old UMAP cols from metadata
bcell_seurat_fil@meta.data <- bcell_seurat_fil@meta.data[,which(!(colnames(bcell_seurat_fil@meta.data) %in% c('UMAP_1', 'UMAP_2')))]

# Add new UMAP cols
bcell_seurat_fil <- AddMetaData(bcell_seurat_fil,
                  data.frame(bcell_seurat_fil@reductions$umap@cell.embeddings))


# Make sure it's not too batchy
ggplot(bcell_seurat_fil@meta.data,
       aes(x=UMAP_1, 
           y=UMAP_2,
           color=tissuename)) +
  geom_point(size=1) +
  facet_wrap(~tissuename) +
  theme(axis.title.y = element_blank(),
        axis.title.x = element_blank())


# Plot
ggplot(bcell_seurat_fil@meta.data,
       aes(x=UMAP_1, 
           y=UMAP_2,
           color=bcell_subclust)) +
  geom_point(size=1) +
  scale_color_manual(values = bcellcols,
                    guide = guide_legend(title = "B-cell\nsubcluster",
                                         keyheight = 0.5,
                                         keywidth = 0.5)) +
  theme(axis.title.y = element_blank(),
        axis.title.x = element_blank())

ggsave(file = 'figures/bcellsubclust_UMAP.svg',
       width = 4,
       height = 3,
       device = svg)



# Plot plasmablast and B-cell identity
ggplot(bcell_seurat_fil@meta.data,
       aes(x=UMAP_1, 
           y=UMAP_2,
           color=clust)) +
  geom_point(size=1) +
  scale_color_manual(values = bcellcols,
                    guide = guide_legend(title = "Patrick\ncell types",
                                         keyheight = 0.5,
                                         keywidth = 0.5)) +
  theme(axis.title.y = element_blank(),
        axis.title.x = element_blank())

ggsave(file = 'figures/bcellPlasma_UMAP.svg',
       width = 4,
       height = 3,
       device = svg)

NA
NA

Subcluster vs other variables

Continuous variables

## define continuous variables
contvars <- list("totalcounts", "Area", "Mean.PanCK", "Max.PanCK", "Mean.CD45", "Max.CD45", "Mean.DAPI", "Max.DAPI")


## B-cells
# MLE-cell vs continuous variables
plts <- lapply(contvars, function(d) {
  ggplot(bcell_seurat@meta.data,
         aes_string(x = "bcell_subclust",
                    y = d)) + geom_violin() +
    geom_jitter(size = 0.5, alpha = 0.1) +
    scale_y_continuous(trans='log10')
  
})
Warning: `aes_string()` was deprecated in ggplot2 3.0.0.
ℹ Please use tidy evaluation idioms with `aes()`.
ℹ See also `vignette("ggplot2-in-packages")` for more information.
This warning is displayed once every 8 hours.
Call `lifecycle::last_lifecycle_warnings()` to see where this warning was generated.
plts <- ggarrange(plotlist=plts, labels = contvars, common.legend = F)
Warning in scale_y_continuous(trans = "log10") :
  log-10 transformation introduced infinite values.
Warning in scale_y_continuous(trans = "log10") :
  log-10 transformation introduced infinite values.
Warning: Removed 17 rows containing non-finite outside the scale range (`stat_ydensity()`).
Warning in scale_y_continuous(trans = "log10") :
  log-10 transformation introduced infinite values.
Warning in scale_y_continuous(trans = "log10") :
  log-10 transformation introduced infinite values.
Warning: Removed 2 rows containing non-finite outside the scale range (`stat_ydensity()`).
Warning in scale_y_continuous(trans = "log10") :
  log-10 transformation introduced infinite values.
Warning in scale_y_continuous(trans = "log10") :
  log-10 transformation introduced infinite values.
Warning: Removed 79 rows containing non-finite outside the scale range (`stat_ydensity()`).
Warning in scale_y_continuous(trans = "log10") :
  log-10 transformation introduced infinite values.
Warning in scale_y_continuous(trans = "log10") :
  log-10 transformation introduced infinite values.
Warning: Removed 26 rows containing non-finite outside the scale range (`stat_ydensity()`).
Warning in scale_y_continuous(trans = "log10") :
  log-10 transformation introduced infinite values.
Warning in scale_y_continuous(trans = "log10") :
  log-10 transformation introduced infinite values.
Warning: Removed 15 rows containing non-finite outside the scale range (`stat_ydensity()`).
Warning in scale_y_continuous(trans = "log10") :
  log-10 transformation introduced infinite values.
Warning in scale_y_continuous(trans = "log10") :
  log-10 transformation introduced infinite values.
Warning: Removed 10 rows containing non-finite outside the scale range (`stat_ydensity()`).
ggsave(filename = 'figures/bcell_MLEcellsubclusts_contvar_metadats.png',
       plts,
       width = 20,
       height = 14)

Discrete variables

## Define discrete variables
discvars <- list("tissuename", "class", "clust", 'context', 'position.vs.glom')

## B-cells
plts <- lapply(discvars, function(d) {
  ggplot(bcell_seurat@meta.data,
         aes_string(x = "bcell_subclust", fill = d)) +
    geom_bar()
  
})

plts <- ggarrange(plotlist=plts,
                  labels = discvars, 
                  common.legend = F)

ggsave(filename = 'figures/bcell_MLEcell_discvar_metadats.png',
       plts,
       width = 20,
       height = 15)

Lupus class

# B-cells
## look at over-representation of clusters in each class
bcell_unsup_lupusclass_chisq <- chisq.test(table(bcell_seurat@meta.data$class,
                                                 bcell_seurat@meta.data$bcell_subclust))
Warning in chisq.test(table(bcell_seurat@meta.data$class, bcell_seurat@meta.data$bcell_subclust)) :
  Chi-squared approximation may be incorrect
bcell_unsup_lupusclass_chisq_res <- melt(bcell_unsup_lupusclass_chisq$residuals)
colnames(bcell_unsup_lupusclass_chisq_res) <- c('class',
                                                'cluster',
                                                'residual')

bcell_unsup_lupusclass_chisq_res %>% 
  arrange(plyr::desc(residual))

## most over-represented cell subset in each cluster, along with residual
bcell_unsup_class_overrep <- bcell_unsup_lupusclass_chisq_res %>%
  group_by(cluster) %>%
  slice_max(n=1, order_by=residual) %>%
  summarize(cluster=cluster, class=class, max_residual=residual, )

## plot class vs cluster with underlying plot of the class most over-represented and its chi-sq residual
## Most interesting are c, e, h, m, and t (residuals > 5)
ggplot() +
  geom_bar(data=bcell_seurat@meta.data,
           color="black",
           aes(x=bcell_subclust,
               fill=class)) +
  geom_point(data=bcell_unsup_class_overrep,
             color="black",
             shape=21,
             aes(x=cluster,
                 y=-30,
                 fill=class,
                 size=max_residual)) +
  labs(title = 'B-cell Subcluster Prevalence across Lupus Nephritis Classes') +
  ylab('Number of cells') +
  xlab('B-cell subluster ID') +
  guides(fill=guide_legend(title="LN Class"),
         size=guide_legend(title='ChiSq Residual'))

ggsave('figures/bcell_subclusterIDvsLNClass.png')
Saving 7.29 x 4.5 in image
# ok, screw that. Let's do a diseased vs undiseased test first instead
bcell_seurat@meta.data$disease = 'LN'
bcell_seurat@meta.data[which(bcell_seurat@meta.data$class == 'control'),'disease'] <- 'Control'

bcell_subclust_chisq_dz <- bind_rows(lapply(new, function(cl) {
  print(cl)
  df <- bcell_seurat@meta.data
  df$cl <- cl
  df$cl <- as.character(df$cl)
  df[which(df$bcell_subclust != cl),'cl'] <- 'other clusters'
  chisq <- chisq.test(table(df$disease, df$cl))
  return(cbind(data.frame(subcluster = cl), broom::tidy(chisq)))
  
  
}))
[1] B.4
Levels: B.1 B.2 B.3 B.4
[1] B.1
Levels: B.1 B.2 B.3 B.4
Warning in chisq.test(table(df$disease, df$cl)) :
  Chi-squared approximation may be incorrect
[1] B.3
Levels: B.1 B.2 B.3 B.4
[1] B.2
Levels: B.1 B.2 B.3 B.4
bcell_subclust_chisq_dz$p.value.adj = p.adjust(bcell_subclust_chisq_dz$p.value,
                                               method = 'BH')

fig <- ggplot() +
  geom_bar(data = bcell_seurat@meta.data,
           aes(y = disease,
               fill = bcell_subclust),
           position = 'fill',
           color = 'black') +
  geom_point(data = data.frame(x=c(0.15, 0.69),
                               y=c('control','sle')),
             aes(x=x,y=y),
             shape=8) +
  scale_fill_manual(values = bcellcols,
                    guide = guide_legend(title = "B-cell\nsubcluster",
                                         keyheight = 0.5,
                                         keywidth = 0.5)) +
  scale_x_continuous(labels = scales::percent) +
  ylab(label = element_blank()) +
  xlab(label = element_blank())


ggsave(filename = 'figures/bcell_subclust_lupusclass.svg',
       plot = fig,
       width = 3,
       height = 1,
       units = "in",
       device = svg)


bcell_subclust_chisq_dz
NA

Tubulointerstitial hotspots

context <- readRDS('processed_data/context4.RDS')
context <- annot[,c('cell_ID', 'context')]
#bcell_seurat@meta.data <- merge(bcell_seurat@meta.data, context, by = 'cell_ID')

df <- melt(table(bcell_seurat@meta.data[,#which(bcell_seurat@meta.data$disease == 'LN'),
                             c('context', 'bcell_subclust', 'disease')]))

# Get the percentage of B.3 cells in hotspots, and overall
all_cell_perc <- df %>% group_by(bcell_subclust) %>% summarize(sum(value)/sum(df$value))
hotspot_perc <- subset(df, context == 'hotspot') %>% group_by(bcell_subclust) %>% summarize(sum(value) / sum(df[which(df$context == 'hotspot'),'value']))

# perform a chisq
chisqtable <- table(data.frame(
  B.3 = sapply(bcell_seurat@meta.data$bcell_subclust, function(c) {c=='B.3'}),
  hotspot = sapply(bcell_seurat@meta.data$context, function(c) {c=='hotspot'})))
chisq.test(chisqtable,
              )

    Pearson's Chi-squared test with Yates' continuity correction

data:  chisqtable
X-squared = 133.67, df = 1, p-value < 2.2e-16
fig <- ggplot() +
  geom_bar(data = bcell_seurat@meta.data,
           aes(y = bcell_subclust,
               fill = context),
           position = 'fill',
           color = 'black') +
  scale_fill_manual(values = c('#80b1d3', '#fb8072', '#bebada', '#fdb462')) +
  scale_x_continuous(labels = scales::percent) +
  ylab(label = 'B-cell\nSubcluster') +
  xlab(label = element_blank()) +
  labs(fill = "Location") +
  theme(legend.position = "bottom",
        legend.key.size = unit(0.3, "cm"),
        legend.margin = margin(t = -0.5, unit = "cm"),
        legend.title = element_text(size = 10)) +
  guides(fill = guide_legend(title.position = 'top',
                             nrow = 4))

ggsave(filename = 'figures/bcell_subclust_hotspots.svg',
       plot = fig,
       width = 2,
       height = 2,
       units = "in",
       device = svg)

Subcluster DEGs

Identify marker genes


# B-cells
# set identity of cells for finding markers to the clusters discovered with MLEcell
Idents(object = bcell_seurat) <- bcell_seurat@meta.data$'bcell_subclust' 

bcell_MLE_markers <- FindAllMarkers(bcell_seurat,
                                    only.pos = TRUE,
                                    min.pct = 0.25,
                                    logfc.threshold = 0.25)
Calculating cluster B.1
For a more efficient implementation of the Wilcoxon Rank Sum Test,
(default method for FindMarkers) please install the limma package
--------------------------------------------
install.packages('BiocManager')
BiocManager::install('limma')
--------------------------------------------
After installation of limma, Seurat will automatically use the more 
efficient implementation (no further action necessary).
This message will be shown once per session

  |                                                  | 0 % ~calculating  
  |++++                                              | 6 % ~00s          
  |+++++++                                           | 12% ~00s          
  |++++++++++                                        | 19% ~00s          
  |+++++++++++++                                     | 25% ~00s          
  |++++++++++++++++                                  | 31% ~00s          
  |+++++++++++++++++++                               | 38% ~00s          
  |++++++++++++++++++++++                            | 44% ~00s          
  |+++++++++++++++++++++++++                         | 50% ~00s          
  |+++++++++++++++++++++++++++++                     | 56% ~00s          
  |++++++++++++++++++++++++++++++++                  | 62% ~00s          
  |+++++++++++++++++++++++++++++++++++               | 69% ~00s          
  |++++++++++++++++++++++++++++++++++++++            | 75% ~00s          
  |+++++++++++++++++++++++++++++++++++++++++         | 81% ~00s          
  |++++++++++++++++++++++++++++++++++++++++++++      | 88% ~00s          
  |+++++++++++++++++++++++++++++++++++++++++++++++   | 94% ~00s          
  |++++++++++++++++++++++++++++++++++++++++++++++++++| 100% elapsed=00s  
Calculating cluster B.2

  |                                                  | 0 % ~calculating  
  |+++                                               | 4 % ~01s          
  |+++++                                             | 8 % ~00s          
  |+++++++                                           | 12% ~00s          
  |+++++++++                                         | 17% ~00s          
  |+++++++++++                                       | 21% ~00s          
  |+++++++++++++                                     | 25% ~00s          
  |+++++++++++++++                                   | 29% ~00s          
  |+++++++++++++++++                                 | 33% ~00s          
  |+++++++++++++++++++                               | 38% ~00s          
  |+++++++++++++++++++++                             | 42% ~00s          
  |+++++++++++++++++++++++                           | 46% ~00s          
  |+++++++++++++++++++++++++                         | 50% ~00s          
  |++++++++++++++++++++++++++++                      | 54% ~00s          
  |++++++++++++++++++++++++++++++                    | 58% ~00s          
  |++++++++++++++++++++++++++++++++                  | 62% ~00s          
  |++++++++++++++++++++++++++++++++++                | 67% ~00s          
  |++++++++++++++++++++++++++++++++++++              | 71% ~00s          
  |++++++++++++++++++++++++++++++++++++++            | 75% ~00s          
  |++++++++++++++++++++++++++++++++++++++++          | 79% ~00s          
  |++++++++++++++++++++++++++++++++++++++++++        | 83% ~00s          
  |++++++++++++++++++++++++++++++++++++++++++++      | 88% ~00s          
  |++++++++++++++++++++++++++++++++++++++++++++++    | 92% ~00s          
  |++++++++++++++++++++++++++++++++++++++++++++++++  | 96% ~00s          
  |++++++++++++++++++++++++++++++++++++++++++++++++++| 100% elapsed=00s  
Calculating cluster B.3

  |                                                  | 0 % ~calculating  
  |++                                                | 4 % ~01s          
  |++++                                              | 8 % ~00s          
  |++++++                                            | 12% ~00s          
  |++++++++                                          | 15% ~00s          
  |++++++++++                                        | 19% ~00s          
  |++++++++++++                                      | 23% ~00s          
  |++++++++++++++                                    | 27% ~00s          
  |++++++++++++++++                                  | 31% ~00s          
  |++++++++++++++++++                                | 35% ~00s          
  |++++++++++++++++++++                              | 38% ~00s          
  |++++++++++++++++++++++                            | 42% ~00s          
  |++++++++++++++++++++++++                          | 46% ~00s          
  |+++++++++++++++++++++++++                         | 50% ~00s          
  |+++++++++++++++++++++++++++                       | 54% ~00s          
  |+++++++++++++++++++++++++++++                     | 58% ~00s          
  |+++++++++++++++++++++++++++++++                   | 62% ~00s          
  |+++++++++++++++++++++++++++++++++                 | 65% ~00s          
  |+++++++++++++++++++++++++++++++++++               | 69% ~00s          
  |+++++++++++++++++++++++++++++++++++++             | 73% ~00s          
  |+++++++++++++++++++++++++++++++++++++++           | 77% ~00s          
  |+++++++++++++++++++++++++++++++++++++++++         | 81% ~00s          
  |+++++++++++++++++++++++++++++++++++++++++++       | 85% ~00s          
  |+++++++++++++++++++++++++++++++++++++++++++++     | 88% ~00s          
  |+++++++++++++++++++++++++++++++++++++++++++++++   | 92% ~00s          
  |+++++++++++++++++++++++++++++++++++++++++++++++++ | 96% ~00s          
  |++++++++++++++++++++++++++++++++++++++++++++++++++| 100% elapsed=00s  
Calculating cluster B.4

  |                                                  | 0 % ~calculating  
  |+                                                 | 2 % ~01s          
  |++                                                | 4 % ~01s          
  |+++                                               | 6 % ~01s          
  |++++                                              | 7 % ~00s          
  |+++++                                             | 9 % ~00s          
  |++++++                                            | 11% ~00s          
  |+++++++                                           | 13% ~00s          
  |++++++++                                          | 15% ~00s          
  |+++++++++                                         | 17% ~00s          
  |++++++++++                                        | 19% ~00s          
  |+++++++++++                                       | 20% ~00s          
  |++++++++++++                                      | 22% ~00s          
  |+++++++++++++                                     | 24% ~00s          
  |+++++++++++++                                     | 26% ~00s          
  |++++++++++++++                                    | 28% ~00s          
  |+++++++++++++++                                   | 30% ~00s          
  |++++++++++++++++                                  | 31% ~00s          
  |+++++++++++++++++                                 | 33% ~00s          
  |++++++++++++++++++                                | 35% ~00s          
  |+++++++++++++++++++                               | 37% ~00s          
  |++++++++++++++++++++                              | 39% ~00s          
  |+++++++++++++++++++++                             | 41% ~00s          
  |++++++++++++++++++++++                            | 43% ~00s          
  |+++++++++++++++++++++++                           | 44% ~00s          
  |++++++++++++++++++++++++                          | 46% ~00s          
  |+++++++++++++++++++++++++                         | 48% ~00s          
  |+++++++++++++++++++++++++                         | 50% ~00s          
  |++++++++++++++++++++++++++                        | 52% ~00s          
  |+++++++++++++++++++++++++++                       | 54% ~00s          
  |++++++++++++++++++++++++++++                      | 56% ~00s          
  |+++++++++++++++++++++++++++++                     | 57% ~00s          
  |++++++++++++++++++++++++++++++                    | 59% ~00s          
  |+++++++++++++++++++++++++++++++                   | 61% ~00s          
  |++++++++++++++++++++++++++++++++                  | 63% ~00s          
  |+++++++++++++++++++++++++++++++++                 | 65% ~00s          
  |++++++++++++++++++++++++++++++++++                | 67% ~00s          
  |+++++++++++++++++++++++++++++++++++               | 69% ~00s          
  |++++++++++++++++++++++++++++++++++++              | 70% ~00s          
  |+++++++++++++++++++++++++++++++++++++             | 72% ~00s          
  |++++++++++++++++++++++++++++++++++++++            | 74% ~00s          
  |++++++++++++++++++++++++++++++++++++++            | 76% ~00s          
  |+++++++++++++++++++++++++++++++++++++++           | 78% ~00s          
  |++++++++++++++++++++++++++++++++++++++++          | 80% ~00s          
  |+++++++++++++++++++++++++++++++++++++++++         | 81% ~00s          
  |++++++++++++++++++++++++++++++++++++++++++        | 83% ~00s          
  |+++++++++++++++++++++++++++++++++++++++++++       | 85% ~00s          
  |++++++++++++++++++++++++++++++++++++++++++++      | 87% ~00s          
  |+++++++++++++++++++++++++++++++++++++++++++++     | 89% ~00s          
  |++++++++++++++++++++++++++++++++++++++++++++++    | 91% ~00s          
  |+++++++++++++++++++++++++++++++++++++++++++++++   | 93% ~00s          
  |++++++++++++++++++++++++++++++++++++++++++++++++  | 94% ~00s          
  |+++++++++++++++++++++++++++++++++++++++++++++++++ | 96% ~00s          
  |++++++++++++++++++++++++++++++++++++++++++++++++++| 98% ~00s          
  |++++++++++++++++++++++++++++++++++++++++++++++++++| 100% elapsed=00s  
bcell_MLE_markers <-  merge(bcell_MLE_markers, 
                                data.frame(contam[,c("B-cell", "plasmablast")]), 
                            by.x = 'gene',
                            by.y = 'row.names',
                            all.x=T)

# Retrive top statistically significant markers
bcell_MLE_markers_top5 <- bcell_MLE_markers %>%
  filter(p_val_adj < 0.01) %>%
    group_by(cluster) %>%
    slice_max(n = 5, order_by = avg_log2FC)

# Plot the cluster and the top three markers on UMAP, with an additional label showing the top 5 genes with genes affected by contamination in RED
for(cl in unique(bcell_MLE_markers_top5$cluster)) {
  
  df <- bcell_MLE_markers_top5 %>%
    filter(cluster == cl) %>%
    arrange(desc(avg_log2FC))

  plts <-lapply(df$gene, function(x) {
    FeaturePlot(bcell_seurat_fil, x, max.cutoff="q99", pt.size=0.2) + ggtitle(x)
  })
  
  dat <- bcell_seurat_fil@meta.data
  dat$alp_cluster <- sapply(dat$bcell_subclust,
                            function(x){
                              if(x==cl){
                                return(1)} else {
                                  return(0.2)
                              }})
  col_ref_table <- data.frame(bcell_subclust = new,
                              clust_color = bcellcols[1:length(new)])
  col_ref_table$clust_color <- apply(col_ref_table,
                                     1,
                                     function(x){
                                        if(x[1]==cl) {
                                          return(x[2])
                                        } else {
                                          return('#9E9E9E')
                                        }
                                      })
                              
  
  p4 <- ggplot(dat,
               aes(x=UMAP_1,
                   y=UMAP_2,
                color=bcell_subclust,
                alpha=alp_cluster)) +
  geom_point(size=0.2) +
  scale_color_manual(values=col_ref_table$clust_color) +
  theme(legend.position="none",
        plot.margin= margin(0.5,6,0.5,0.5,unit='cm'))
  
  
  df$pval_adj <- sapply(df$p_val_adj, function(x) sprintf("%.2e", x))
  df$log2FC <- sapply(df$avg_log2FC, function(x) round(x, digits = 2))
    
  p5 <- gridExtra::tableGrob(df[,c('gene',
                                   'p_val_adj',
                                   'log2FC',
                                   'pct.1',
                                   'pct.2'
                                   )])
  
  
  if(length(plts)==1) {G1 <- (plts[[1]] | plot_spacer() | plot_spacer()) / (p4|p5|plot_spacer()) } else 
    if(length(plts)==2) {G1 <- (plts[[1]] | plts[[2]] | plot_spacer()) / (p4|p5|plot_spacer()) } else
      {G1 <- (plts[[1]] | plts[[2]] | plts[[3]]) / (p4|p5|plot_spacer()) }
  
  ggsave(paste0('figures/bcell_subclust_',cl,'_markergenes.png',
                                  sep=""),
         G1,
         width=10,
         height=5,
         units='in')
}

write.csv(bcell_MLE_markers, paste0('bcell_MLE_markers.csv'))

DEGs of interest

goi <- c('IGHM', 'IGHA1', 'IGHG1', 'XBP1', 'HLA-DQA1', 'HLA-DPA1')

# Make a list of feature plots
figs <- lapply(goi, function(g) {
  FeaturePlot(bcell_seurat_fil,
                   features = g,
              pt.size = 0.1,
              max.cutoff = 'q95') + 
    ## add my theme
    my_theme +
    ## make it publication ready
    theme(
      axis.text.x = element_blank(),
      axis.text.y = element_blank(),
      axis.title.x = element_blank(),
      axis.title.y = element_blank(),
      plot.title = element_text(face = "italic",
                                size = 10),
      axis.ticks = element_blank(),
      legend.position = "none"
)})

# Put feature plots together
faceted_plot <- wrap_plots(plotlist = figs,
                           ncol = 2)

# Plot it
ggsave(filename = 'figures/bcell_subclust_goi.svg',
       plot = faceted_plot,
       width = 2.5,
       height = 4,
       units = "in",
       device = svg)

Lupus vs control analyses

Number of cells

df <- bcell_seurat@meta.data %>%
  filter(!tissue %in% c("SP20_1098", "SP20_10838")) %>%
  group_by(tissue, disease) %>%
  summarize(number_bcells = n())
`summarise()` has grouped output by 'tissue'. You can override using the `.groups` argument.
wilcox.test(unlist(df[which(df$disease == 'Control'), 'number_bcells']),
            unlist(df[which(df$disease == 'LN'), 'number_bcells']),
            alternative = 'less')

    Wilcoxon rank sum exact test

data:  unlist(df[which(df$disease == "Control"), "number_bcells"]) and unlist(df[which(df$disease == "LN"), "number_bcells"])
W = 0, p-value = 0.00202
alternative hypothesis: true location shift is less than 0
ggplot(df,
       aes(x = disease,
           y = number_bcells,
           fill = disease)) +
  geom_boxplot(outlier.shape = NA) +
  geom_jitter() +
  scale_fill_manual(values = c('#0571b0', '#ca0020')) +
  ylab('Number of B-cells') +
  xlab(label = element_blank()) +
  theme(legend.position='none')

ggsave(file = 'figures/lupuscontrols_numbcells.svg',
       width = 1.5,
       height = 1.5,
       device = svg)

NA
NA

Number of each subcluster

df <- bcell_seurat@meta.data %>%
  filter(!tissue %in% c("SP20_1098", "SP20_10838")) %>%
  group_by(tissue, disease, bcell_subclust) %>%
  summarize(number_cells = n())
`summarise()` has grouped output by 'tissue', 'disease'. You can override using the `.groups` argument.
lapply(unique(df$bcell_subclust), function(cl) {
  df <- df[which(df$bcell_subclust == cl),]
  wilcox.test(unlist(df[which(df$disease == 'Control'), 'number_cells']),
            unlist(df[which(df$disease == 'LN'), 'number_cells']))
})
Warning in wilcox.test.default(unlist(df[which(df$disease == "Control"),  :
  cannot compute exact p-value with ties
Warning in wilcox.test.default(unlist(df[which(df$disease == "Control"),  :
  cannot compute exact p-value with ties
Warning in wilcox.test.default(unlist(df[which(df$disease == "Control"),  :
  cannot compute exact p-value with ties
[[1]]

    Wilcoxon rank sum test with continuity correction

data:  unlist(df[which(df$disease == "Control"), "number_cells"]) and unlist(df[which(df$disease == "LN"), "number_cells"])
W = 0, p-value = 0.01863
alternative hypothesis: true location shift is not equal to 0


[[2]]

    Wilcoxon rank sum exact test

data:  unlist(df[which(df$disease == "Control"), "number_cells"]) and unlist(df[which(df$disease == "LN"), "number_cells"])
W = 0, p-value = 0.00404
alternative hypothesis: true location shift is not equal to 0


[[3]]

    Wilcoxon rank sum test with continuity correction

data:  unlist(df[which(df$disease == "Control"), "number_cells"]) and unlist(df[which(df$disease == "LN"), "number_cells"])
W = 1, p-value = 0.0317
alternative hypothesis: true location shift is not equal to 0


[[4]]

    Wilcoxon rank sum test with continuity correction

data:  unlist(df[which(df$disease == "Control"), "number_cells"]) and unlist(df[which(df$disease == "LN"), "number_cells"])
W = 0, p-value = 0.01837
alternative hypothesis: true location shift is not equal to 0
ggplot(df,
       aes(x = disease,
           y = number_cells,
           fill = disease)) +
  geom_boxplot(outlier.shape = NA) +
  geom_jitter(width = 0.15) +
  scale_fill_manual(values = c('#0571b0', '#ca0020')) +
  facet_wrap(~bcell_subclust) +
  ylab('Number of B-cells') +
  xlab(label = element_blank()) +
  theme(legend.position='none')

ggsave(file = 'figures/lupuscontrols_numbcells_subclust.svg',
       width = 3.5,
       height = 3.5,
       device = svg)

NA
NA

Proportion of each subcluster

bcell_seurat@meta.data <- bcell_seurat@meta.data[,which(
  !(duplicated(colnames(bcell_seurat@meta.data)))
)]

df <- bcell_seurat@meta.data %>%
  filter(!tissue %in% c("SP20_1098", "SP20_10838")) %>%
  group_by(tissue, disease, bcell_unsup.clust) %>%
  summarize(number_cells = n()) %>%
  mutate(freq = number_cells/sum(number_cells))
`summarise()` has grouped output by 'tissue', 'disease'. You can override using the `.groups` argument.
wilcox.test(unlist(df[which(df$disease == 'Control'), 'number_cells']),
            unlist(df[which(df$disease == 'LN'), 'number_cells']))
Warning in wilcox.test.default(unlist(df[which(df$disease == "Control"),  :
  cannot compute exact p-value with ties

    Wilcoxon rank sum test with continuity correction

data:  unlist(df[which(df$disease == "Control"), "number_cells"]) and unlist(df[which(df$disease == "LN"), "number_cells"])
W = 6.5, p-value = 4.691e-07
alternative hypothesis: true location shift is not equal to 0
ggplot() +
  geom_bar(data = bcell_seurat@meta.data,
           aes(x = disease,
               fill = bcell_subclust),
           position = 'fill',
           color = 'black') +
  geom_point(data = data.frame(y=c(0.15, 0.70),
                               x=c('Control', 'LN')),
             aes(x=x,y=y),
             shape=8) +
  scale_fill_manual(values = bcellcols,
                    guide = guide_legend(title = "B-cell\nsubcluster",
                                         keyheight = 0.5,
                                         keywidth = 0.5)) +
  scale_y_continuous(labels = scales::percent) +
  ylab(label = element_blank()) +
  xlab(label = element_blank())
  

ggsave(file = 'figures/lupuscontrols_propsubclusts.svg',
       width = 2.5,
       height = 3,
       device = svg)

Visual analyses

Load data for visual analyses

# load data
xycoords <- customlocs
row.names(xycoords) <- colnames(raw)

# calculate pairwise distance matrices for all immune cells
dists <- sapply(unique(annot$tissue), function(tis) { 
  
  cells = filter(annot, (tissue == tis &
                           !(cell_ID %in% HB_cells) & # remove hemoglobin+ cells from immune cells
                        basictype %in% c('tcell_cd4',
                                         'tcell_cd8',
                                         'bcell',
                                         'mycell'))) %>% dplyr::select(cell_ID) %>% unlist
  return(dist(xycoords[cells,]))
  
  })

Number of cells within 50 cells

TO perform this analysis, each tissue must be assessed independently to prevent too muchy memory from being used.

# define function that retrieves the 50 closest cells for a given set of "cells of interest"
find_closest_cells <- function(distance_matrix,
                               num_closest_cells,
                               cois = subset(annot, basictype == 'bcell')$cell_ID) { 
  
  ## filter for B cells only
  distance_matrix <- sapply(cois, 
                function(c) {
                  usedist::dist_get(distance_matrix,
                                    c,
                                    cells)
                            })
  row.names(distance_matrix) <- cells
                            
  print(dim(distance_matrix))
  cell_names <- row.names(distance_matrix)
  num_cells <- ncol(distance_matrix)
  closest_cells_list <- vector("list", num_cells)
  
  for (i in 1:num_cells) {
    distances <- distance_matrix[,i]
    closest_indices <- order(distances)[1:num_closest_cells]
    
    closest_cell_names <- cell_names[closest_indices]
    closest_cells_list[[i]] <- closest_cell_names
  }
  
  names(closest_cells_list) <- colnames(distance_matrix)
  return(closest_cells_list)
}

# define function that takes a list of cells and counts the number of immune cells
count_imm_cells <- function(cell_list) {
  
  annot_subset <- subset(annot, basictype %in% (c('bcell',
                                                  'mycell',
                                                  'tcell',
                                                  'NKcell')))
  return(sum(sapply(cell_list, function(c) {c %in% annot_subset$cell_ID})))
}

# iterate through each tissue sample to assess the number of immune cells next to each cell
## initialize empty list
tissue_ids <- unique(annot$tissue)
num_tissues <- length(tissue_ids)
tissue_bcell_nimmune_cells <- vector("list", num_tissues)

## iterate through each tissue's xycords:
for(i in 1:num_tissues) {
  print(paste0('Analzying tissue ', tissue_ids[i]))
  ### compute distance matrix
  cells = filter(annot, (tissue == tissue_ids[i]))$cell_ID
  distance_matrix <- dist(xycoords[cells,])
  
  ### get 50 closest cells to each B cell (not counting the cell itself..)
  closest_cells <- find_closest_cells(distance_matrix,
                                      51,
                                      subset(annot,
                                             (basictype == 'bcell' &
                                               tissue == tissue_ids[i]))$cell_ID)  
  rm(distance_matrix)
  gc() # save memory
  ### count number of immune cells in each list of 50
  imm_cell_nums <- lapply(closest_cells, count_imm_cells)
  ### populate the empty list
  tissue_bcell_nimmune_cells[[i]] <- data.frame(cell_ID = names(closest_cells),
                                                n_imm_cells = unlist(imm_cell_nums)-1) # remove one from each to remove self
} 
[1] "Analzying tissue SP17_2566"
[1] 27795   111
[1] "Analzying tissue SP21_213"
[1] 49093  1081
[1] "Analzying tissue SP17_8693"
[1] 18784    78
[1] "Analzying tissue SP18_3323"
[1] 27247    96
[1] "Analzying tissue SP18_8471"
[1] 12926    67
[1] "Analzying tissue SP19_1139"
[1] 60740   275
[1] "Analzying tissue SP19_4061"
[1] 16025   237
[1] "Analzying tissue SP20_642"
[1] 11839   479
[1] "Analzying tissue SP20_1098"
[1] 30671   111
[1] "Analzying tissue SP20_10838"
[1] 33404   323
[1] "Analzying tissue control2"
[1] 77004     7
[1] "Analzying tissue SP17-1782-A5"
[1] 26112     2
[1] "Analzying tissue SP19-5113"
[1] 130220     19
[1] "Analzying tissue SP22-5235-B14"
[1] 10532    11
tissue_bcell_nimmune_cells_df <- bind_rows(tissue_bcell_nimmune_cells)

## plot data, separating controls and SLE patients
### Prep data
tissue_bcell_nimmune_cells_df$imm_hotspot <- as.numeric(tissue_bcell_nimmune_cells_df$n_imm_cells > 0)
tissue_bcell_nimmune_cells_df <- merge(tissue_bcell_nimmune_cells_df, bcell_seurat@meta.data[,c('bcell_subclust', 'disease')], by = 'row.names')


tab <- table(tissue_bcell_nimmune_cells_df[which(tissue_bcell_nimmune_cells_df$disease=='LN'),c('bcell_subclust', 'imm_hotspot')])
tab[,1] / tab[,2]
       B.1        B.2        B.3        B.4 
0.06769231 0.04226705 0.01237113 0.11557789 
### column for whether a cell is in an tubulointerstitial hotspot
df <- tissue_bcell_nimmune_cells_df
df$context <- sapply(df$cell_ID, function(ci) {annot[ci,'context']})
df$tubinst_hotspot <- sapply(df$context, function(c) {c == 'hotspot'})


### save df
write.csv(df, file = "num_imm_wi_50.csv")

### read df
df <- read.csv("num_imm_wi_50.csv", row.names = 1)

### plot data
ggplot(df,
       aes(x = n_imm_cells,
           fill = as.factor(context))) +
  geom_histogram(color = 'black') +
  facet_wrap(disease~ bcell_subclust,
             scales = 'free_y',
             nrow = 2) +
  scale_fill_manual(values = c('#80b1d3', '#fb8072', '#bebada', '#fdb462')) +
  ylab(label = element_blank()) +
  xlab(label = 'Number of Nearby Immune Cells') +
  labs(fill = "Location") +
  theme(legend.position = "bottom",
        legend.key.size = unit(0.3, "cm"),
        legend.margin = margin(t = 0, unit = "cm"),
        legend.title = element_text(size = 10))
`stat_bin()` using `bins = 30`. Pick better value with `binwidth`.
ggsave(file = 'figures/lupuscontrols_numbimmcells_location_subclust.svg',
       width = 6,
       height = 3.5,
       device = svg)
`stat_bin()` using `bins = 30`. Pick better value with `binwidth`.

Network Analysis

Hypergeometric dists clust

# fit hypergeometric parameters for each cell type for each sample
adj_matrices <- lapply(dists, function(d) { 
  tmp <- annot[which(annot$cell_ID %in% colnames(as.matrix(d))), c('cell_ID', 'clust')]
  annot_list <- tmp$clust
  names(annot_list) <- tmp$cell_ID
  return(make_adj_mat(d,
                      annot_list,
                      0.1))
  }); names(adj_matrices) <- names(dists)


# get parameters for hypergeometric distribution
adj_matrix_hyperparams <- lapply(seq(1, length(adj_matrices)), function(n) {
  print(n)
  ## define the number of cell types within each distance matrix using the annot dataframe
  ### get the cells from the annotation dataframe
  nctypes <- table(annot[which(annot$cell_ID %in% colnames(as.matrix(dists[[n]]))), 'clust'])
  ### reorder the nctypes to be the same as the columns in the dataset
  nctypes <- nctypes[colnames(adj_matrices[[n]])]
  out <- adj_mat_to_hypergeo_params(adj_matrices[[n]],
                       nctypes)
  out$tissue <- names(dists)[n]
  return(out)
}) %>% bind_rows()
[1] 1
[1] 2
[1] 3
[1] 4
[1] 5
[1] 6
[1] 7
[1] 8
[1] 9
[1] 10
[1] 11
[1] 12
[1] 13
[1] 14
# look at the networks control vs lupus cases
## define control and sle samples
control_samples <- unique(annot[which(annot$class == 'control'),'tissue'])
sle_samples <- unique(annot[which(annot$class != 'control'), 'tissue'])
adj_matrix_hyperparams$disease <- 'control'
adj_matrix_hyperparams[which(adj_matrix_hyperparams$tissue %in% sle_samples),
                       'disease'] <- 'sle'

adj_matrix_hyperparams$ct1.2 <- t(apply(adj_matrix_hyperparams[,c('ct1', 'ct2')],
                                      1,
                                      function(r) {
                                        paste(unlist(r), 
                                              sep = '_')
                                      }))

## do the following to each set of samples:
### (1) sum hypergeometric distribution hyperparameters (m, n, k) and observed edges (x)
### (2) calculate the expected number of edges (expected.edges)
### (3) calculate the fold increase over expected (fold.incr)
### (4) calculate a p-value

sle.v.control.clust <- adj_matrix_hyperparams %>% 
  dplyr::group_by(ct1, ct2, disease) %>%
  summarise(m = sum(m),
            n = sum(n),
            k = sum(k),
            x = sum(x),
            expected.edges = max(c(qhyper(p=0.5,
                                          m = sum(m),
                                          k = sum(k),
                                          n = sum(n)),
                                   0.5)),
            p.val = max(c(phyper(q=sum(x),
                                 m=sum(m),
                                 k=sum(k),
                                 n=sum(n),
                                 lower.tail = F,
                                 log.p = F),
                          1e-30)))
`summarise()` has grouped output by 'ct1', 'ct2'. You can override using the `.groups` argument.
# add log2FC of observed over expected
sle.v.control.clust$log2.o.e <- log2(sle.v.control.clust$x/sle.v.control.clust$expected.edges)

## adjust p-value for sle and controls separately
### sle
sle <- sle.v.control.clust[which(sle.v.control.clust$disease == 'sle'),]
sle$p.adj <- p.adjust(sle$p.val,
                      method = 'BH')
### control
ctrl <- sle.v.control.clust[which(sle.v.control.clust$disease == 'control'),]            
ctrl$p.adj <- p.adjust(ctrl$p.val,
                      method = 'BH')


# plot the results
## make a key of abbreviated names
key_df <- t(data.frame(c('B-cell', "Bc"),
                     c("plasmablast", "PC"),
                     c("macrophage", "Mφ"),
                     c("mast", "Mast"),
                     c("mDC", "mDC"),
                     c("pDC", "pDC"),
                     c("monocyte", "Mono"),
                     c("neutrophil", "Neut"),
                     c("tcell_cd4", "Tc4"),
                     c("tcell_cd8", "Tc8"),
                     c('B.1', 'B.1'),
                     c('B.2', 'B.2'),
                     c('B.3', 'B.3'),
                     c('B.4', 'B.4')))
key_vector <- key_df[,2]
names(key_vector) <- key_df[,1]

## make a color coded list
colors <- c(rep('#8da0cb', 2), rep('#fc8d62', 6), rep('#66c2a5', 2), rep('#8da0cb', 4))
names(colors) <- key_df[,2]

## apply the key to the sle dataset
sle$ct1_abr <- sapply(sle$ct1, function(c) {key_vector[c]})
sle$ct2_abr <- sapply(sle$ct2, function(c) {key_vector[c]})

## sle
sle.fil.g <- graph_from_data_frame(sle[which(sle$p.adj < 0.01),
                                                      c('ct1_abr',
                                                        'ct2_abr',
                                                        'log2.o.e',
                                                        'p.adj'
                                                        )],
                                   directed = F)

sle.fil.g <- set_vertex_attr(sle.fil.g, "color", value = colors[get.vertex.attribute(sle.fil.g, "name")])
Warning: `get.vertex.attribute()` was deprecated in igraph 2.0.0.
ℹ Please use `vertex_attr()` instead.
This warning is displayed once every 8 hours.
Call `lifecycle::last_lifecycle_warnings()` to see where this warning was generated.
## remove self-interacting nodes
g <- sle.fil.g
sle.fil.g_noself <- igraph::simplify(g, remove.loops = TRUE)
custom_layout <- layout_with_fr(sle.fil.g_noself)


### try to plot with normal plots
#### NB: need to copy and paste into the console, cannot run from here
dev.new(noRStudioGD = T)
svg(filename = 'figures/graph_interactions_sle.svg',
    onefile=T)
plot(sle.fil.g_noself,
     vertex.label = V(sle.fil.g)$name,
     vertex.color = V(sle.fil.g)$color,
     edge.color = adjustcolor("black", alpha.f = 0.5),
     edge.width = 2^E(sle.fil.g)$log2.o.e,
     layout = custom_layout,
     vertex.label.family = "Arial",
     vertex.label.color = 'black',
     vertex.label.cex = 0.8,
     vertex.size = 25)

leg_incr <- c(2,5,10)

legend("topleft",
       legend=as.character(leg_incr),
       col=adjustcolor("black", alpha.f=0.5),
       lwd=c(leg_incr),
       title="Obs/Exp Interactions")

dev.off()
png 
  2 
### plot as heat-map type thing
ggplot(subset(sle, p.adj < 0.01),
       aes(x = ct1_abr,
           y = ct2_abr,
           size = log2.o.e,
           color = log10(p.adj))) +
  geom_point() +
  scale_color_viridis_b() +
  theme(axis.text.x = element_text(angle = 45, vjust = 1, hjust = 1))

## control
## apply the key to the sle dataset
ctrl$ct1_abr <- sapply(ctrl$ct1, function(c) {key_vector[c]})
ctrl$ct2_abr <- sapply(ctrl$ct2, function(c) {key_vector[c]})

ctrl.fil.g <- graph_from_data_frame(ctrl[which(ctrl$p.adj < 0.01),
                                                      c('ct1_abr',
                                                        'ct2_abr',
                                                        'log2.o.e',
                                                        'p.adj'
                                                        )],
                                   directed = F)

ctrl.fil.g <- set_vertex_attr(ctrl.fil.g, "color", value = colors[get.vertex.attribute(ctrl.fil.g, "name")])

## remove self-interacting nodes
g <- ctrl.fil.g
ctrl.fil.g_noself <- igraph::simplify(g, remove.loops = TRUE)
custom_layout <- layout_with_fr(ctrl.fil.g_noself)


### try to plot with normal plots
#### NB: need to copy and paste into the console, cannot run from here
dev.new(noRStudioGD = T)
svg(filename = 'figures/graph_interactions_ctrl.svg',
    onefile=T)
plot(ctrl.fil.g_noself,
     vertex.label = V(ctrl.fil.g)$name,
     vertex.color = V(ctrl.fil.g)$color,
     edge.color = adjustcolor("black", alpha.f = 0.5),
     edge.width = 2^E(ctrl.fil.g)$log2.o.e,
     layout = custom_layout,
     vertex.label.family = "Arial",
     vertex.label.color = 'black',
     vertex.label.cex = 0.8,
     vertex.size = 25)

leg_incr <- c(2,5,10)

legend("bottomright",
       legend=as.character(leg_incr),
       col=adjustcolor("black", alpha.f=0.5),
       lwd=c(leg_incr),
       title="Obs/Exp Interactions")

dev.off()
png 
  2 

Hypergeometric dist subclusts

Repeating the analysis above but including B-cell subclusters

# update annot dataframe to combine B-cell subclusters in a new column, "clust_bcellsubcl"
annot$clust_bcellsubcl <- annot$clust
bcellrows <- which(annot$clust %in% c('B-cell', 'plasmablast'))
row.names(bcell_seurat@meta.data) <- bcell_seurat@meta.data$cell_ID
annot[bcellrows,'clust_bcellsubcl'] <- as.character(bcell_seurat@meta.data[annot$cell_ID[bcellrows],
                                                                               'bcell_subclust'])

annot_norbcs <- annot[which(!(is.na(annot$clust_bcellsubcl))),]


# Combine T cell subsets in the clust_bcellsubcl
tcells <- subset(annot, ((basictype == 'tcell_cd4') | (basictype == 'tcell_cd8')))$cell_ID
annot[tcells,]$clust_bcellsubcl <- annot[tcells,'basictype']

# get an adjacency matrix for all subcluster cells
adj_matrices_subclust <- lapply(dists, function(d) { 
  tmp <- annot_norbcs[which(annot_norbcs$cell_ID %in% colnames(as.matrix(d))), c('cell_ID', 'clust_bcellsubcl')]
  annot_list <- tmp$clust_bcellsubcl
  names(annot_list) <- tmp$cell_ID
  return(make_adj_mat(d,
                      annot_list,
                      0.1))
  }); names(adj_matrices_subclust) <- names(dists)


# get parameters for hypergeometric distribution
adj_matrix_hyperparams_subclust <- lapply(seq(1, length(adj_matrices_subclust)), function(n) {
  print(n)
  ## define the number of cell types within each distance matrix using the annot dataframe
  ### get the cells from the annotation dataframe
  nctypes <- table(annot_norbcs[which(annot_norbcs$cell_ID %in% colnames(as.matrix(dists[[n]]))), 'clust_bcellsubcl'])
  ### reorder the nctypes to be the same as the columns in the dataset
  nctypes <- nctypes[colnames(adj_matrices_subclust[[n]])]
  out <- adj_mat_to_hypergeo_params(adj_matrices_subclust[[n]],
                       nctypes)
  out$tissue <- names(dists)[n]
  return(out)
}) %>% bind_rows()
[1] 1
[1] 2
[1] 3
[1] 4
[1] 5
[1] 6
[1] 7
[1] 8
[1] 9
[1] 10
[1] 11
[1] 12
[1] 13
[1] 14
# look at subclusters in control vs lupus samples
adj_matrix_hyperparams_subclust$disease <- 'control'
adj_matrix_hyperparams_subclust[which(adj_matrix_hyperparams_subclust$tissue %in% sle_samples),
                       'disease'] <- 'sle'

sle.v.control_subclust <- adj_matrix_hyperparams_subclust %>% 
  dplyr::group_by(ct1, ct2, disease) %>%
  summarise(m = sum(m),
            n = sum(n),
            k = sum(k),
            x = sum(x),
            expected.edges = max(c(qhyper(p=0.5,
                                          m = sum(m),
                                          k = sum(k),
                                          n = sum(n)),
                                   0.5)),
            p.val = max(c(phyper(q=sum(x),
                                 m=sum(m),
                                 k=sum(k),
                                 n=sum(n),
                                 lower.tail = F,
                                 log.p = F),
                          1e-30)))
`summarise()` has grouped output by 'ct1', 'ct2'. You can override using the `.groups` argument.
# add log2FC of observed over expected
sle.v.control_subclust$log2.o.e <- log2(sle.v.control_subclust$x/sle.v.control_subclust$expected.edges)
# add simple ratio
sle.v.control_subclust$o.e <- sle.v.control_subclust$x/sle.v.control_subclust$expected.edges

## adjust p-value for sle and controls separately
### sle
sle <- sle.v.control_subclust[which(sle.v.control_subclust$disease == 'sle'),]
sle$p.adj <- p.adjust(sle$p.val,
                      method = 'BH')
sle[which(sle$p.adj == 0),'p.adj'] <- 1e-30

### control
ctrl <- sle.v.control_subclust[which(sle.v.control_subclust$disease == 'control'),]            
ctrl$p.adj <- p.adjust(ctrl$p.val,
                      method = 'BH')



# plot the results
## apply the key to the sle dataset
sle$ct1_abr <- sapply(sle$ct1, function(c) {key_vector[c]})
sle$ct2_abr <- sapply(sle$ct2, function(c) {key_vector[c]})

## sle
sle.fil.g <- graph_from_data_frame(sle[which(sle$p.adj < 0.01),
                                                      c('ct1_abr',
                                                        'ct2_abr',
                                                        'log2.o.e',
                                                        'p.adj'
                                                        )],
                                   directed = F)

sle.fil.g <- set_vertex_attr(sle.fil.g, "color", value = colors[get.vertex.attribute(sle.fil.g, "name")])

## remove self-interacting nodes
g <- sle.fil.g
sle.fil.g_noself <- igraph::simplify(g, remove.loops = TRUE)
custom_layout <- layout_with_fr(sle.fil.g_noself)


### try to plot with normal plots
#### NB: need to copy and paste into the console, cannot run from here
dev.new(noRStudioGD = T)
svg(filename = 'figures/graph_interactions_sle.svg',
    onefile=T)
plot(sle.fil.g_noself,
     vertex.label = V(sle.fil.g)$name,
     vertex.color = V(sle.fil.g)$color,
     edge.color = adjustcolor("black", alpha.f = 0.5),
     edge.width = 2^E(sle.fil.g)$log2.o.e,
     layout = custom_layout,
     vertex.label.family = "Arial",
     vertex.label.color = 'black',
     vertex.label.cex = 0.8,
     vertex.size = 25)

leg_incr <- c(2,5,10)

legend("topleft",
       legend=as.character(leg_incr),
       col=adjustcolor("black", alpha.f=0.5),
       lwd=c(leg_incr),
       title="Obs/Exp Interactions")

dev.off()
png 
  2 
## control
## apply the key to the sle dataset
ctrl$ct1_abr <- sapply(ctrl$ct1, function(c) {key_vector[c]})
ctrl$ct2_abr <- sapply(ctrl$ct2, function(c) {key_vector[c]})

ctrl.fil.g <- graph_from_data_frame(ctrl[which(ctrl$p.adj < 0.01),
                                                      c('ct1_abr',
                                                        'ct2_abr',
                                                        'log2.o.e',
                                                        'p.adj'
                                                        )],
                                   directed = F)

ctrl.fil.g <- set_vertex_attr(ctrl.fil.g, "color", value = colors[get.vertex.attribute(ctrl.fil.g, "name")])

## remove self-interacting nodes
g <- ctrl.fil.g
ctrl.fil.g_noself <- igraph::simplify(g, remove.loops = TRUE)
custom_layout <- layout_with_fr(ctrl.fil.g_noself)


### try to plot with normal plots
#### NB: need to copy and paste into the console, cannot run from here
dev.new(noRStudioGD = T)
svg(filename = 'figures/graph_interactions_ctrl.svg',
    onefile=T)
plot(ctrl.fil.g_noself,
     vertex.label = V(ctrl.fil.g)$name,
     vertex.color = V(ctrl.fil.g)$color,
     edge.color = adjustcolor("black", alpha.f = 0.5),
     edge.width = 2^E(ctrl.fil.g)$log2.o.e,
     layout = custom_layout,
     vertex.label.family = "Arial",
     vertex.label.color = 'black',
     vertex.label.cex = 0.8,
     vertex.size = 25)

leg_incr <- c(2,5,10)

legend("topright",
       legend=as.character(leg_incr),
       col=adjustcolor("black", alpha.f=0.5),
       lwd=c(leg_incr),
       title="Obs/Exp Interactions")

dev.off()
png 
  2 

Proportion of each interaction type that occur within hotspots vs other areas

# make adjacency matrix of all immune cells
adj_matrices_imms <- lapply(dists, function(d) { 
  tmp <- annot[which(annot$cell_ID %in% rownames(as.matrix(d))), c('cell_ID', 'clust_bcellsubcl')]
  annot_list <- tmp$clust
  names(annot_list) <- tmp$cell_ID
  return(make_adj_mat(d,
                      annot_list,
                      0.1,
                      collapse_query = F)) }) %>%
  bind_rows() %>% 
  ## merge in information about location of the query cells
  merge(.,
        bcell_seurat@meta.data[,c('cell_ID',
                                  'disease',
                                  'context')],
        by.x = 'row.names',
        by.y = 'cell_ID')
  
  ## rename the cell_ID column
  colnames(adj_matrices_imms)[1] <- "cell_ID"
  
  ## replace NA with 0
  adj_matrices_imms <- replace(adj_matrices_imms, is.na(adj_matrices_imms), 0)

# filter for just B.3 cells in LN
# make a dataframe with the number of interactions for each group within each context
cell_types <- colnames(adj_matrices_imms)[2:13]
df <- adj_matrices_imms %>% subset(celltype == 'B.3' & 
                                     disease == 'LN') %>%
  group_by(context) %>%
  summarise(across(all_of(cell_types), sum, .names = "{.col}")) %>%
  t(.) %>% as.data.frame(); colnames(df) <- df[1,]; df <- df[-1,]

# melt the df such that it can be plotte in ggplot2
df$interacting_cell <- row.names(df)
df_plot <- melt(df, id.vars = 'interacting_cell')
df_plot$value <- as.numeric(df_plot$value)
df_plot_props <- df_plot %>% group_by(interacting_cell) %>% summarise(contex = variable,
                                                                      prop_contex = value / sum(value))
Warning: Returning more (or less) than 1 row per `summarise()` group was deprecated in dplyr 1.1.0.
ℹ Please use `reframe()` instead.
ℹ When switching from `summarise()` to `reframe()`, remember that `reframe()` always returns an ungrouped data frame and
  adjust accordingly.
Call `lifecycle::last_lifecycle_warnings()` to see where this warning was generated.
`summarise()` has grouped output by 'interacting_cell'. You can override using the `.groups` argument.
df_plot_ns <- df_plot %>% group_by(interacting_cell) %>% summarise(totn = sum(value))


plt <- ggplot() + 
  geom_bar(data = df_plot_props,
           aes(x = interacting_cell, 
               y = prop_contex, 
               fill = contex),
           color = 'black',
           stat = 'identity') +
  geom_text(data = df_plot_ns,
            aes(x = interacting_cell,
                y = 1.05,
                angle = 45,
                label = totn),
            size = 3,
            hjust = 0) +
  scale_fill_manual(values = c('#80b1d3', '#fb8072', '#bebada', '#fdb462')) +
  scale_y_continuous(expand = expand_scale(mult = c(0, 0.12)),
                     breaks = seq(0,1,0.25)) +
  scale_x_discrete(expand = expand_scale(mult = c(0, 0.1))) +
  theme(axis.text.x = element_text(angle = 45, hjust = 1),
        axis.title.y = element_blank()) +
  xlab(label = 'B.3-interacting Cell') +
  labs(fill = "Context")
Warning: `expand_scale()` was deprecated in ggplot2 3.3.0.
ℹ Please use `expansion()` instead.
This warning is displayed once every 8 hours.
Call `lifecycle::last_lifecycle_warnings()` to see where this warning was generated.
  
  
ggsave(plt,
       file = 'figures/B3_interactioncontext_SLE.svg',
       width = 5,
       height = 3.5,
       device = svg)
LS0tCnRpdGxlOiAiQiBjZWxsIEFuYWx5c2VzIGZvciBjTE4gQ29zTXggUGFwZXIiCm91dHB1dDogaHRtbF9ub3RlYm9vawplZGl0b3Jfb3B0aW9uczogCiAgY2h1bmtfb3V0cHV0X3R5cGU6IGlubGluZQpjaHVua19vdXRwdXRfdHlwZTogaW5saW5lCi0tLQoKCiMgTG9hZCBwYWNrYWdlcyBhbmQgcHJlcCBkYXRhCiMjIExvYWQgcGFja2FnZXMKYGBge3IgTG9hZCBwYWNrYWdlc30Kc291cmNlKCc5LiBsb2FkX3BrZ3NfQmNlbGxBbmFseXNpcy5SJykKbG9hZGZvbnRzKCdwZGYnKQp0aGVtZV9zZXQodGhlbWVfY2xhc3NpYygpKQpteV90aGVtZSA8LSB0aGVtZSgKICB0ZXh0ID0gZWxlbWVudF90ZXh0KGZhbWlseSA9ICdBcmlhbE1UJyksCiAgYXhpcy5saW5lID0gZWxlbWVudF9saW5lKGxpbmV3aWR0aCA9IDEpLAogIGF4aXMudGlja3MgPSBlbGVtZW50X2xpbmUobGluZXdpZHRoID0gMC41KSwKICBheGlzLnRpdGxlID0gZWxlbWVudF90ZXh0KHNpemUgPSAxMCksCiAgYXhpcy50ZXh0ID0gZWxlbWVudF90ZXh0KHNpemUgPSA4KSwKICBsZWdlbmQudGl0bGUgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDgpLAogIGxlZ2VuZC50ZXh0ID0gZWxlbWVudF90ZXh0KHNpemUgPSA4KQopCnRoZW1lX3VwZGF0ZSgKICB0ZXh0ID0gZWxlbWVudF90ZXh0KGZhbWlseSA9ICdBcmlhbE1UJyksCiAgYXhpcy5saW5lID0gZWxlbWVudF9saW5lKGxpbmV3aWR0aCA9IDEpLAogIGF4aXMudGlja3MgPSBlbGVtZW50X2xpbmUobGluZXdpZHRoID0gMC41KSwKICBheGlzLnRpdGxlID0gZWxlbWVudF90ZXh0KHNpemUgPSAxMCksCiAgYXhpcy50ZXh0ID0gZWxlbWVudF90ZXh0KHNpemUgPSA4KSwKICBsZWdlbmQudGl0bGUgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDgpLAogIGxlZ2VuZC50ZXh0ID0gZWxlbWVudF90ZXh0KHNpemUgPSA4KSkKICAKCmBgYAojIyBEZWZpbmUgY3VzdG9tIGZ1bmN0aW9ucwoKIyMjIFNwYXRpYWwgYW5hbHlzaXMgZnVuY3Rpb25zCiMjIyMgQ3JlYXRlIGFkamFjZW5jeSBtYXRyaXgKRnVuY3Rpb24gdGhhdCBjcmVhdGVzIGFuIGFkamFjZW5jeSBtYXRyaXggYnkgcXVlcnlpbmcgZWFjaCBjZWxsIGZvciB0aGUgY2VsbCB0eXBlcyBvZiBlYWNoIHRhcmdldCBjZWxsIHdpdGhpbiBhIGNlcnRpYW4gZGlzdGFuY2UgWCwgdGhlbiBzdW1zIGFjcm9zcyBlYWNoIGNlbGwgdHlwZS4KYGBge3J9CgojIERlZmluZSBmdW5jdGlvbgptYWtlX2Fkal9tYXQgPC0gZnVuY3Rpb24oCiAgIyBvdXRwdXQgb2YgZGlzdCBmdW5jdGlvbiAgCiAgZGlzdF9vYmosIAogICMgbmFtZWQgbGlzdCBvZiBjZWxsIG5hbWVzIGFuZCBjZWxsIHR5cGVzCiAgYW5ub3RfbGlzdCwKICAjIGRpc3RhbmNlCiAgZGlzdFgsCiAgIyBjb2xsYXBzZSBxdWVyeSBjZWxscz8gKGkuZS4gY29sdW1ucykKICBjb2xsYXBzZV9xdWVyeSA9IFQpIHsgIAogIAogICMjIHJldHJpZXZlIG1hdHJpeCBvYmplY3QgZnJvbSBkaXN0IG9iamVjdAogIGRtYXQgPC1hcy5tYXRyaXgoZGlzdF9vYmopCiAgCiAgIyMgaXRlcmF0ZSB0aHJvdWdoIGVhY2ggcXVlcnkgY2VsbAogIHRtcG1hdCA8LSBzYXBwbHkoY29sbmFtZXMoZG1hdCksIGZ1bmN0aW9uKGNlbGxpZCkgewogICAgCiAgICAjIyMgb2J0YWluIGFsbCB0YXJnZXQgY2VsbHMgd2l0aGluIGRpc3RYIGRpc3RhbmNlCiAgICBjZWxsIDwtIGRtYXRbLGNlbGxpZF0KICAgIGNlbGxfZmlsIDwtIGNlbGxbd2hpY2goKGNlbGwgPCBkaXN0WCkgJiAoY2VsbCAhPSAwKSldCiAgICAjIyMgZ2V0IHRoZSBjZWxsIHR5cGUgb2YgZWFjaCBjZWxsIGFuZCBjb3VudCB1c2luZyB0aGUgYW5ub3QgZGF0YWZyYW1lCiAgICBvdXQgPC0gdChhcy5tYXRyaXgodGFibGUoYW5ub3RfbGlzdFtuYW1lcyhjZWxsX2ZpbCldKSkpCiAgICByb3cubmFtZXMob3V0KSA8LSBjZWxsaWQKICAgIHJldHVybihvdXQpCiAgfSkKICAKICAjIyBwdXQgYWxsIGNlbGxzIHRvZ2V0aGVyCiAgdG1wbWF0IDwtIHJiaW5kLmZpbGwubWF0cml4KHRtcG1hdCkKICByb3cubmFtZXModG1wbWF0KSA8LSBjb2xuYW1lcyhkbWF0KQogICMjIGFkZCBjbHVzdCB0byBlYWNoIHF1ZXJ5IGNlbGwKICB0bXBtYXQgPC0gYXMuZGF0YS5mcmFtZSh0bXBtYXQpCiAgdG1wbWF0JGNlbGx0eXBlIDwtIGFubm90X2xpc3Rbcm93Lm5hbWVzKHRtcG1hdCldCiAgCiAgIyMgY29sbGFwc2UgYWxsIHF1ZXJ5IGNlbGxzIGludG8gY2x1c3QgYXMgd2VsbAogIGlmKGNvbGxhcHNlX3F1ZXJ5KXsKICAKICBvdXRtYXQgPC0gdG1wbWF0ICU+JSBncm91cF9ieShjZWxsdHlwZSkgJT4lCiAgc3VtbWFyaXNlKGFjcm9zcyhldmVyeXRoaW5nKCksIH4gc3VtKC4sIG5hLnJtPVQpKSkKICBybmFtZXMgPC0gb3V0bWF0JGNlbGx0eXBlICMgbWFrZSByb3duYW1lcyB0aGUgY2VsbCB0eXBlIAogIG91dG1hdCA8LSBhcy5tYXRyaXgob3V0bWF0Wyx3aGljaChjb2xuYW1lcyhvdXRtYXQpICE9J2NlbGx0eXBlJyldKSAjIHJlbW92ZSBjZWxsdHlwZSBjb2x1bW4KICByb3cubmFtZXMob3V0bWF0KSA8LSBybmFtZXMKICBvdXRtYXQgPC0gb3V0bWF0W2NvbG5hbWVzKG91dG1hdCksXSAjIG1ha2Ugcm93bmFtZXMgYW5kIGNvbG5hbWVzIHRoZSBzYW1lIG9yZGVyCiAgfSBlbHNlIHsKICBvdXRtYXQgPC0gdG1wbWF0CiAgfQogIAogICMjIHJldHVybiB0aGUgZmluYWwgZGF0YWZyYW1lCiAgcmV0dXJuKG91dG1hdCkKICAKICB9CgpgYGAKCiMjIyMgR2V0IGh5cGVyZ2VvIHBhcmFtZXRlcnMKCkdvaW5nIHRvIHVzZSBhIGh5cGVyZ2VvbWV0cmljIGRpc3RyaWJ1dGlvbiBvZiBlZGdlcyBhYiwgd2hlcmUgYSA9IGNlbGx0eXBlIDEgKGN0MSksIGIgPSBjZWxsdHlwZTIgKGN0MiksIGFuZDoKKiB4ID0gb2JzZXJ2ZWQgbnVtYmVyIG9mIHRpbWVzIGFiIGlzIHNlZW4gaW4gdGhlIGRhdGEKKiBtID0gdG90YWwgbnVtYmVyIG9mIHBvc3NpYmxlIGVkZ2VzIHRoYXQgaW5jbHVkZSBhYgogICAgKiBpZiBhICE9IGI6IG0gPSAoTmEgKiBOYikKICAgICogaWYgYSA9PSBiOiBtID0gY2hvb3NlKE5hLDIpCiogbiA9IHRvdGFsIG51bWJlciBvZiBwb3NzaWJsZSBlZGdlcyB0aGF0IERPTidUIGluY2x1ZGUgYWI6IFsgKCgoTnQqTnQpLU50KS8yKSAtIG0gXSAoY2VsbHMgY2FuJ3QgYmUgdGhlaXIgb3duIGVkZ2U7IGRyYXcgYSBkdW1teSBtYXRyaXggdG8gbWFrZSBzZW5zZSBvZiB0aGlzIGZvcm11bGEpCiogayA9IG51bWJlciBvZiBlZGdlcyBpbiB0aGUgZGF0YXNldAoKTm90ZSB0aGF0IGl0J3Mgb2sgdG8gYWRkIHRoZXNlIHZhbHVlcyB0b2dldGhlciBhY3Jvc3MgY2VsbHMgZnJvbSB0aGUgc2FtZSAiZ3JvdXAiCgpgYGB7cn0KIyBEZWZpbmUgZnVuY3Rpb24KYWRqX21hdF90b19oeXBlcmdlb19wYXJhbXMgPC0gZnVuY3Rpb24oCiAgICAjIGFkamFjZW5jeSBtYXRyaXgKICAgIG91dG1hdCwgICAKICAgICMgbmFtZWQgdmVjdG9yIG9mIG51bWJlciBvZiBjZWxscyBvZiBlYWNoIHR5cGUgaW4gdGhlIGRhdGFzZXQuIE5hbWVzIG11c3QgbWF0Y2ggYWRqYWNlbmN5IG1hdHJpeCBjb2x1bW4gYW5kIHJvdyBuYW1lcyAgICAgICAgICAgICAgIAogICAgbmN0eXBlcykKICB7IAoKICAgICMgZW5zdXJlIHRoYXQgYWxsIGNlbGwgdHlwZXMgYXJlIGZvdW5kIGluIGVhY2ggb2YKICAgICMjIHJvd25hbWVzIG91dG1hdAogICAgIyMgY29sbmFtZXMgb3V0bWF0CiAgICAjIyBuYW1lcyBvZiBuY3R5cGUKICAgIGlmKGFueShyb3cubmFtZXMob3V0bWF0KSAhPSBjb2xuYW1lcyhvdXRtYXQpKSkgewogICAgICBzdG9wKCJSb3cgbmFtZXMgYW5kIGNvbHVtbiBuYW1lcyBvZiBvdXRtYXQgZG8gbm90IG1hdGNoLiIpCiAgICB9CiAgICAgIAogICAgaWYoIShhbGwocm93Lm5hbWVzKG91dG1hdCkgJWluJSBuYW1lcyhuY3R5cGVzKSkgJiBhbGwobmFtZXMobmN0eXBlcykgJWluJSByb3cubmFtZXMob3V0bWF0KSkpKSB7CiAgICAgIHN0b3AoIlJvdyBuYW1lcyBvZiBvdXRtYXQgYW5kIG5hbWVzIG9mIG5jdHlwZSBkbyBub3QgbWF0Y2guIikKICAgIH0KICAgIAogIAogICAgIyMgY3JlYXRlIG91dHB1dCBkYXRhZnJhbWU6CiAgICAjIyMgZGV0ZXJtaW5lIHVuaXF1ZSBjb21iaW5hdGlvbnMgb2YgY2VsbCB0eXBlcwogICAgIyMjIyBzb3J0IG5jdHlwZXMgZmlyc3QgdG8gbWFrZSBzdXJlIHRoYXQgdGhlIGNvbWJpbmF0aW9ucyBhcmUgbWFkZSBjb3JyZWN0bHkKICAgIG91dCA8LSBhcy5kYXRhLmZyYW1lKGNvbWJpbmF0aW9ucyhuID0gbGVuZ3RoKG5hbWVzKG5jdHlwZXMpKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHIgPSAyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdiA9IHNvcnQobmFtZXMobmN0eXBlcykpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVwZWF0cy5hbGxvd2VkID0gVCkpCiAgICBjb2xuYW1lcyhvdXQpIDwtIGMoJ2N0MScsICdjdDInKQogIAogICAgIyMgY2FsYyB0b3RhbCBudW1iZXIgb2YgZWFjaCBjZWxsIHR5cGUgaW4gZGF0YXNldAogICAgbnRfY2VsbCA8LSBzdW0obmN0eXBlcykKICAgIG50X2VkZ2UgPC0gc3VtKG91dG1hdCkvMgogICAgCiAgICAjIyBmb3IgZWFjaCBjZWxsIGluIHRoZSBhZGphY2VuY3kgbWF0cml4LCBkZWZpbmUgcGFyYW1ldGVycyBvZiBoeXBlcmdlb21ldHJpYyBkaXN0cmlidXRpb24KICAgICMjIGlmIG91dHB1dCA9ICdoeXBlcl9maXQnLCB0aGVuIGRldGVybWluZSBwIHZhbHVlcyBhbmQgZXhwZWN0ZWQgbnVtYmVyIG9mIGVkZ2VzIGdpdmVuIHRoZSBwYXJhbXMKICAgIAogICAgcGFyYW1zIDwtIHQoYXBwbHkob3V0LCAxLCBmdW5jdGlvbihyKSB7CiAgICAgICAgCiAgICAgICAgIyMjIGRlZmluZSBjdDEgYW5kIGN0MgogICAgICAgIGN0MSA9IHVubGlzdChyWydjdDEnXSkKICAgICAgICBjdDIgPSB1bmxpc3QoclsnY3QyJ10pCiAgICAgIAogICAgICAgICMjIyBkZWZpbmUgcGFyYW1ldGVycyBvZiBoeXBlcmdlb21ldHJpYyBkaXN0cmlidXRpb24KICAgICAgICB4IDwtIG91dG1hdFtjdDIsIGN0MV0KICAgICAgICBpZihjdDE9PWN0MikgewogICAgICAgICAgICAgIG0gPC0gY2hvb3NlKG5jdHlwZXNbY3QxXSwgMil9IGVsc2UgewogICAgICAgICAgICAgIG0gPC0gbmN0eXBlc1tjdDFdICogbmN0eXBlc1tjdDJdfQogICAgICAgIG4gPC0gKChudF9jZWxsICogbnRfY2VsbCkgLSBudF9jZWxsKS8yIC0gbQogICAgICAgIGsgPC0gbnRfZWRnZQogICAgICAgIAogICAgICAgICMjIyByZXR1cm4gcGFyYW1ldGVycwogICAgICAgIHJldHVybihjKG0sIG4sIGssIHgpKQogICAgICAgICAgCiAgICAgICAgfSkpCiAgICAKICAgIG91dCA8LSBjYmluZChvdXQsIHBhcmFtcykKICAgIGNvbG5hbWVzKG91dCkgPC0gYygnY3QxJywgJ2N0MicsICdtJywgJ24nLCAnaycsICd4JykgICAKICAgIHJldHVybihvdXQpICAKICAgIH0KICAgIApgYGAKCiMjIyMgRml0IGh5cGVyZ2VvIHBhcmFtZXRlcnMKVGhpcyBmdW5jdGlvbiBmaXRzIHRoZSBkYXRhIHRvIGEgaHlwZXJnZW9tZXRyaWMgZGlzdHJpYnV0aW9uIGFuZCBjYWxjdWxhdGVzIGZvbGQgaW5jcmVhc2VkIGludGVyYWN0aW9ucyBvdmVyIGV4cGVjdGVkCgpgYGB7cn0KIyBEZWZpbmUgZnVuY3Rpb24KZml0X2h5cGVyX2dlbyA8LSBmdW5jdGlvbigKICAgICMgdGhlIG51bWJlciBvZiBvYnNlcnZlZCBpbnRlcmFjdGlvbnMgYmV0d2VlbiB0d28gY2VsbCB0eSBwZXMKICAgIG9ic2VydmVkX2VkZ2VfbiwgICAKICAgICMgdGhlIGV4cGVjdGVkIGh5cGVycGFyYW1ldGVycyBmb3IgdGhvc2UgdHdvIGNlbGwgdHlwZXMKICAgIGV4cGVjX2h5cGVycGFyYW1zCiAgICApeyAKICAKICAKICAjIyBjYWxjIHRoZSBleHBlY3RlZCBudW1iZXIgb2YgZWRnZXMKICBleHBlYyA8LSAgbipLL04KICAKICAjIyBjYWxjIHRoZSBmb2xkIGluY3JlYXNlIG9mIG9ic2VydmVkIC8gZXhwZWN0ZWQKICBmb2xkaW5jciA8LSBvYnNlcnZlZF9lZGdlX24gLyBleHBlYwogIAogICMjIGNhbGMgdGhlIHAgdmFsdWUgCiAgcHZhbCA8LSBwaHlwZXIocT14LAogICAgICAgICAgICAgICAgIG09bSwKICAgICAgICAgICAgICAgICBrPWssCiAgICAgICAgICAgICAgICAgbj1uLAogICAgICAgICAgICAgICAgIGxvd2VyLnRhaWwgPSBULAogICAgICAgICAgICAgICAgIGxvZy5wID0gVCkKICAgICAgICAgIAogICMjIHJldHVybiB0aGUgZGF0YQogIG91dCA9IGxpc3QoZXhwZWMsIGZvbGRpbmNyLCBwdmFsKQogIG5hbWVzKG91dCkgPSBjKCdudWxsLmV4cGVjLmVkZ2VzJywgJ2ZvbGQuaW5jci5vdmVyLm51bGwnLCAncC52YWwnKQogIHJldHVybihvdXQpCn0KICAKYGBgCgoKCmBgYHtyfQpnZW5lbW9kc19tbGVfZmluZG1hcmtlcnMgPC0gZnVuY3Rpb24oc2V1cmF0X29iaiwgIyBTZXVyYXQgb2JqZWN0CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByYXdkYXRhID0gTlVMTCwgIyBzcGFyc2UgY291bnRzIG1hdHJpeCwgcm93cyA9IGdlbmVzLCBjb2x1bW5zID0gY2VsbHMKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1sZV9uZWdtLCAjIHZlY3RvciBvZiBtZWFuIG5lZ3Byb2JlIGNvdW50cyBwZXIgY2VsbCwgc2VlICJpbnNpdHV0eXBlIiBmdW5jdGlvbgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWxlX2NvaG9ydCwgIyBkYXRhZnJhbWUgb2YgcGFyYW1ldGVycyB1c2VkIGZvciBmYXN0Q29ob3J0aW5nLCBzZWUgImluc2l0dXR5cGUiIGZ1bmN0aW9uCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbGVfbmNsdXN0ID0gTlVMTCwgIyB2ZWN0b3Igb2YgbGVuZ3RoIDIgc3BlY2lmeWluZyB0aGUgbWluaW11bSBhbmQgbWF4aW11bSBudW1iZXIgb2YgY2x1c3RlcnMgZm9yIE1MRSBjZWxsIHRvIGdlbmVyYXRlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2dmY19taW4gPSAwLjUgIyBtaW5pbXVtIGxvZzJmYyByZXF1aXJlZCBmb3IgZ2VuZXMgdG8gYmUgZGVzaWduYXRlZCBhcyBtYXJrZXIgZ2VuZXMgb2YgYSBzdWJjbHVzdGVyCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApIHsKICAKICAKICAjIGRlZmluZSByYXcgZGF0YSBpZiB1bmRlZmluZWQKICBpZihpcy5udWxsKHJhd2RhdGEpKSB7CiAgICByYXdkYXRhIDwtIHNldXJhdF9vYmpAYXNzYXlzJG5hbm9zdHJSTkFAY291bnRzCiAgfQogIAogIAogICMgZGVmaW5lIG5jbHVzdCBpZiB1bmRlZmluZWQKICBpZihpcy5udWxsKG1sZV9uY2x1c3QpKSB7CiAgICBtbGVfbmNsdXN0IDwtIGMoMiwgCiAgIyMgdGhlIG1heGltdW0gbnVtYmVyIG9mIGNsdXN0ZXJzIHNob3VsZCBlaXRoZXIgYmUgdGhlIGxlc3NlciBvZjogKGEpIHRoZSBudW1iZXIgb2YgZ2VuZXMgb3IgKGIpIHRoZSBudW1iZXIgb2YgY2VsbHMgLyAxMCwgYXNzdW1pbmcgdGhhdCBjbHVzdGVycyBvbiBhdmVyYWdlIHNob3VsZCBoYXZlIGF0IGxlYXN0IDEwIGNlbGxzCiAgICAgICAgICAgICAgICAgICAgbWluKGMobnJvdyhyYXcpLCByb3VuZChuY29sKHJhdykvMTApKSkpCiAgfQogIAogIAogICMgUGVyZm9ybSB1bnN1cGVydmlzZWQgY2VsbCBjbHVzdGVyaW5nCiAgICAjIyBDb2hvcnQgY2VsbHMKICAgIG1sZV9jb2hvIDwtIGZhc3RDb2hvcnRpbmcobWF0ID0gbWxlX2NvaG9ydCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2F1c3NpYW5fdHJhbnNmb3JtID0gVFJVRSkKICAgIAogICAgCiAgICAjIyBDbHVzdGVyIGNlbGxzCiAgICBtbGVfdW5zdXAgPC0gaW5zaXR1dHlwZShjb3VudHMgPSB0KGFzLm1hdHJpeChyYXdkYXRhKSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZWcgPSBtbGVfbmdlbSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvaG9ydCA9IG1sZV9jb2hvLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgbl9jbHVzdHMgPSBtbGVfbmNsdXN0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVmZXJlbmNlX3Byb2ZpbGVzID0gTlVMTCkgIyBOVUxMIHZhbHVlIHJ1bnMgdW5zdXBlcnZpc2VkIGNsdXN0ZXJpbmcKICAgIAogICAgCiAgICAjIyBQbG90IGNsdXN0ZXJzCiAgICBtbGVfaG0gPC0gaGVhdG1hcChzd2VlcChtbGVfdW5zdXAkcHJvZmlsZXMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAxLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgcG1heChhcHBseShtbGVfdW5zdXAkcHJvZmlsZXMsIDEsIG1heCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC4yKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvIiksCiAgICAgICAgICAgICAgICAgICAgICBzY2FsZSA9ICJub25lIiwKICAgICAgICAgICAgICAgICAgICAgIG1haW4gPSAiU3ViY2x1c3RlciBNZWFuIEV4cHJlc3Npb24gUHJvZmlsZXMiKQogICAgCiAgICAKICAgICMjIEFkZCBjbHVzdGVyIGRhdGEgdG8gU2V1cmF0IG9iamVjdAogICAgc2V1cmF0X29iaiA8LSBBZGRNZXRhRGF0YShzZXVyYXRfb2JqLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YS5mcmFtZShtbGVfdW5zdXAkY2x1c3QpKQogIAogIAogICMgUnVuIE1hcmtlciBHZW5lIGFuYWx5c2lzCiAgSWRlbnRzKG9iamVjdCA9IHNldXJhdF9vYmopIDwtIHNldXJhdF9vYmpAbWV0YS5kYXRhJCdtbGVfc3ViY2x1c3QnIAoKICBtbGVfc3ViY2x1c3RfbWFya2VycyA8LSBGaW5kQWxsTWFya2VycyhzZXVyYXRfb2JqLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9ubHkucG9zID0gVFJVRSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtaW4ucGN0ID0gMC4yNSkKICAKCiAgIyBPdXRwdXQKICBvdXQgPC0gbGlzdCgpCiAgb3V0JGNlbGxfY2x1c3Rlcl9oZWF0bWFwIDwtIG1sZV9obQogIAogIHJldHVybihvdXQpCiAgCn0KCiAKYGBgCgoKIyMgTG9hZCBkYXRhCmBgYHtyIExvYWQgZGF0YX0Kc2V0LnNlZWQoMCkKbG9hZCgicHJvY2Vzc2VkX2RhdGEvY2xlYW5lZGRhdGEuUkRhdGEiKSAjIHNjUk5Bc2VxIGRhdGEKbG9hZCgicHJvY2Vzc2VkX2RhdGEvY2Fubm90IHdpdGggZGlzdGFuY2VzIGZyb20gZ2xvbXMuUkRhdGEiKSAjIGdsb21lcnVsYXIgZGlzdGFuY2UgaW5mb3JtYXRpb24gZnJvbSBQYXRyaWNrCmNvbnRleHQgPC0gcmVhZFJEUygncHJvY2Vzc2VkX2RhdGEvY29udGV4dDQuUkRTJykKbmFtZXMoY29udGV4dCkgPC0gY29sbmFtZXMocmF3KQpjb250YW0gPC0gcmVhZFJEUygncHJvY2Vzc2VkX2RhdGEvdG9vbXVjaGNvbnRhbS5SRFMnKSAjIGdlbmUgY29udGFtaW5hdGlvbiBjYWxscyBieSBQYXRyaWNrCgpgYGAKCiMgUHJlLXByb2Nlc3MgZGF0YQoKVG8gcmVtb3ZlIGdlbmVzIHRoYXQgYXJlICJleHByZXNzZWQiIGluIGNlbGxzIGR1ZSB0byBwb29yIHNlZ21lbnRhdGlvbiwgSSB3aWxsIHVzZSBQYXRyaWNrJ3MgY29udGFtaW5hdGlvbiBkYXRhc2V0OiAiY29udGFtaW5hdGluZyB0cmFuc2NyaXB0cyBmcm9tIGltcGVyZmVjdCBjZWxsIHNlZ21lbnRhdGlvbiDigJMgZS5nLiBpZiBhIEItY2VsbCBpcyBzdXJyb3VuZGVkIGJ5IFBDVCBjZWxscywgdGhlbiB3aGVuIHdlIG9jY2FzaW9uYWxseSBkcmF3IGEgY2VsbCBib3VuZGFyeSB3cm9uZyB3ZeKAmWxsIHBsYWNlIHNvbWUgUENUIHRyYW5zY3JpcHRzIGluIGEgQi1jZWxsLiBTbyBpZiBhbnkgb2YgeW91ciBjbHVzdGVycyBhcmUgZHJpdmVuIGJ5IGdlbmVzIHR5cGljYWwgb2YgYW5vdGhlciBjZWxsIHR5cGUsIHN1c3BlY3QgYW4gYXJ0aWZhY3QuIApGb3IgZWFjaCBjZWxsIHR5cGUgeCBnZW5lLCB0aGUgYXR0YWNoZWQgbWF0cml4IG1lYXN1cmVzIGhvdyBtdWNoIHRoZSBnZW5lIGNvbWVzIGZyb20gdGhlIGFwcHJvcHJpYXRlIGNlbGwgdHlwZSB2cy4gZnJvbSBjb250YW1pbmF0aW9uIOKAkyBoaWdoZXIgdmFsdWVzIG1lYW4gbW9yZSBwdXJlIC8gbGVzcyBjb250YW1pbmF0ZWQgZGF0YS4gWW91IGNhbiB1c2UgdGhpcyB0byBjaGVjayBpZiBhbnkgb2YgeW91ciBCLWNlbGwgY2x1c3RlciBtYXJrZXIgZ2VuZXMgYXJlIGNvbnRhbWluYW50cy4gRm9yIGRpZmZlcmVudGlhbCBleHByZXNzaW9uLCBJ4oCZbSBvbmx5IGNvbnNpZGVyaW5nIGdlbmVzIHdpdGggdmFsdWVzIGFib3ZlIDAuMi4iCgpXaWxsIHVzZSBjb3RhbXN0YXQuUkRTIHRvIGxvb2sgYXQgdGhlIGNvbnRhbWluYXRpb24gcmF0ZXMgZnJvbSB0aGUgZ2VuZS4gV2UgY2FuIGxvb2sgYXQgZWFjaCBzdGF0aXN0aWNhbGx5IHNpZ25pZmljYW50IGdlbmUgCgojIyBEZWZpbmUgY2VsbCB0eXBlcyBhbmQgZmlsdGVyIGdlbmVzCkRpc3RyaWJ1dGlvbiBvZiBnZW5lIGNvbnRhbWluYXRpb24gc2NvcmVzCmBgYHtyIERlZmluZSBDZWxsIFR5cGVzfQoKY2Q0X3RjZWxsX3R5cGVzIDwtIGMoICJUIENENCBtZW1vcnkiLAogICAgICAgICAgICAgICAgICAgICAgIlQgQ0Q0IG5haXZlIiwKICAgICAgICAgICAgICAgICAgICAgICJUcmVnIikKCmNkOF90Y2VsbF90eXBlcyA8LSBjKCAiVCBDRDggbWVtb3J5IiwKICAgICAgICAgICAgICAgICAgICAgICJUIENEOCBuYWl2ZSIpCgpnbG9tY2VsbF90eXBlcyA8LSBjKCJQb2RvY3l0ZSIsCiAgICAgICAgICAgICAgICAgICAgIkdsb21lcnVsYXIuZW5kb3RoZWxpdW0iLAogICAgICAgICAgICAgICAgICAgICJNZXNhbmdpYWwuY2VsbCIsCiAgICAgICAgICAgICAgICAgICAgIlBhcmlldGFsLmVwaXRoZWxpdW0iKQoKdmVzc2xjZWxsX3R5cGVzIDwtIGMoIlZhc2N1bGFyLnBlcmljeXRlIiwKICAgICAgICAgICAgICAgICAgICAgIlBlcml0dWJ1bGFyLmNhcGlsbGFyeS5lbmRvdGhlbGl1bS4xIiwKICAgICAgICAgICAgICAgICAgICAgIlBlcml0dWJ1bGFyLmNhcGlsbGFyeS5lbmRvdGhlbGl1bS4yIiwKICAgICAgICAgICAgICAgICAgICAgIkFzY2VuZGluZy52YXNhLnJlY3RhLmVuZG90aGVsaXVtIiwKICAgICAgICAgICAgICAgICAgICAgIkRlc2NlbmRpbmcudmFzYS5yZWN0YS5lbmRvdGhlbGl1bSIpCgp0dWJjZWxsX3R5cGVzIDwtIGMoIkNvbm5lY3RpbmcudHVidWxlIiwKICAgICAgICAgICAgICAgICAgICJQQ1QiLAogICAgICAgICAgICAgICAgICAgIlByaW5jaXBhbC5jZWxsIiwKICAgICAgICAgICAgICAgICAgICJUeXBlLkEuaW50ZXJjYWxhdGVkLmNlbGwiLAogICAgICAgICAgICAgICAgICAgIlR5cGUuQi5pbnRlcmNhbGF0ZWQuY2VsbCIsCiAgICAgICAgICAgICAgICAgICAiUGVsdmljLmVwaXRoZWxpdW0iLAogICAgICAgICAgICAgICAgICAgIlRoaWNrLmFzY2VuZGluZy5saW1iLm9mLkxvb3Aub2YuSGVubGUiLAogICAgICAgICAgICAgICAgICAgIkluZGlzdGluY3QuaW50ZXJjYWxhdGVkLmNlbGwiLAogICAgICAgICAgICAgICAgICAgIlRyYW5zaXRpb25hbC51cm90aGVsaXVtIiwKICAgICAgICAgICAgICAgICAgICJFcGl0aGVsaWFsLnByb2dlbml0b3IuY2VsbCIpCgppbm5hdGVfbHltcGggPC0gYygiTksiKQoKaW50ZXJzdGNlbGxfdHlwZXMgPC0gYygiTXlvZmlicm9ibGFzdCIsCiAgICAgICAgICAgICAgICAgICAgICAgIkZpYnJvYmxhc3QiKQoKIyBEZWZpbmUgY2VsbCB0eXBlcwphbGxfY2VsbF90eXBlcyA8LSBsZXZlbHMoYXMuZmFjdG9yKGNsdXN0KSkKCmltbV9jZWxsX3R5cGVzIDwtIGMoIkItY2VsbCIsCiAgICAgICAgICAgICAgICAgICAgIm1hY3JvcGhhZ2UiLAogICAgICAgICAgICAgICAgICAgICJtYXN0IiwKICAgICAgICAgICAgICAgICAgICAibURDIiwKICAgICAgICAgICAgICAgICAgICAibW9ub2N5dGUiLAogICAgICAgICAgICAgICAgICAgICJuZXV0cm9waGlsIiwKICAgICAgICAgICAgICAgICAgICAiTksiLAogICAgICAgICAgICAgICAgICAgICJwREMiLAogICAgICAgICAgICAgICAgICAgICJwbGFzbWFibGFzdCIsCiAgICAgICAgICAgICAgICAgICAgIlQgQ0Q0IG1lbW9yeSIsCiAgICAgICAgICAgICAgICAgICAgIlQgQ0Q0IG5haXZlIiwKICAgICAgICAgICAgICAgICAgICAiVCBDRDggbWVtb3J5IiwKICAgICAgICAgICAgICAgICAgICAiVCBDRDggbmFpdmUiLAogICAgICAgICAgICAgICAgICAgICJUcmVnIikKCmJfY2VsbF90eXBlcyA8LSBjKCJCLWNlbGwiLAogICAgICAgICAgICAgICAgICAicGxhc21hYmxhc3QiKQoKbXlfY2VsbF90eXBlcyA8LSBjKCJtYWNyb3BoYWdlIiwKICAgICAgICAgICAgICAgICAgICAgICAgIm1hc3QiLAogICAgICAgICAgICAgICAgICAgICAgICAibURDIiwKICAgICAgICAgICAgICAgICAgICAgICAgIm1vbm9jeXRlIiwKICAgICAgICAgICAgICAgICAgICAgICAgIm5ldXRyb3BoaWwiLAogICAgICAgICAgICAgICAgICAgICAgICAicERDIikKCnN0cl9jZWxsX3R5cGVzIDwtIHN1YnNldChhbGxfY2VsbF90eXBlcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgIShhbGxfY2VsbF90eXBlcyAlaW4lIGltbV9jZWxsX3R5cGVzKSAmCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGFsbF9jZWxsX3R5cGVzICE9ICJOb3REZXQiKSkKICAgICAgICAgICAgICAgICAgICAKCmJhc2ljX2NhdHMgPC0gZnVuY3Rpb24oeCkgewogIGlmKHggJWluJSBiX2NlbGxfdHlwZXMpIHsgcmV0dXJuKCdiY2VsbCcpIH0gZWxzZSB7CiAgICBpZih4ICVpbiUgY2Q0X3RjZWxsX3R5cGVzKSB7IHJldHVybigndGNlbGxfY2Q0JykgfSBlbHNlIHsKICAgIGlmKHggJWluJSBjZDhfdGNlbGxfdHlwZXMpIHsgcmV0dXJuKCd0Y2VsbF9jZDgnKSB9IGVsc2UgewogICAgICBpZih4ICVpbiUgbXlfY2VsbF90eXBlcykgeyByZXR1cm4oJ215Y2VsbCcpIH0gZWxzZSB7CiAgICAgICAgaWYoeCAlaW4lIGdsb21jZWxsX3R5cGVzKSB7cmV0dXJuKCdnbG9tY2VsbCcpIH0gZWxzZSB7CiAgICAgICAgICBpZih4ICVpbiUgdmVzc2xjZWxsX3R5cGVzKSB7cmV0dXJuKCd2ZXNzbGNlbGwnKX0gZWxzZSB7CiAgICAgICAgICAgIGlmKHggJWluJSB0dWJjZWxsX3R5cGVzKSB7cmV0dXJuKCd0dWJjZWxsJyl9IGVsc2UgewogICAgICAgICAgICAgIGlmKHggJWluJSBpbnRlcnN0Y2VsbF90eXBlcykge3JldHVybignaW50ZXJzdGNlbGwnKX0gZWxzZSB7CiAgICAgICAgICAgICAgICBpZih4ICVpbiUgaW5uYXRlX2x5bXBoKSB7cmV0dXJuKCdOS2NlbGwnKX0KICAgICAgICAgICAgICAgIHJldHVybigiRVJST1IiKQogICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgfQogICAgICAgIH0KICAgICAgfQogICAgfQogIH0KICB9Cn0KCiMgb3JnYW5pemUgbWV0YWRhdGEKYW5ub3QgPC0gbWVyZ2UoYW5ub3QsIGRhdGEuZnJhbWUoY2x1c3QpLCBieS54ID0gImNlbGxfSUQiLCBieS55ID0gInJvdy5uYW1lcyIpIAojIGFkZCBjZWxsIGNhbGxzCnJvdy5uYW1lcyhhbm5vdCkgPC0gYW5ub3QkY2VsbF9JRAojIGFubm90YXRlIGNlbGxzIHdpdGggbGFyZ2VyIGNlbGwgdHlwZSBiaW5zCmFubm90JGJhc2ljdHlwZSA8LSBzYXBwbHkoYW5ub3QkY2x1c3QsIGJhc2ljX2NhdHMpCmFubm90JGFscGhhIDwtIHNhcHBseShhbm5vdCRiYXNpY3R5cGUsIGZ1bmN0aW9uKHgpIHsKICBpZih4ICVpbiUgYygndGNlbGwnLCAnYmNlbGwnLCAnbXljZWxsJykpIHtyZXR1cm4oMSl9IGVsc2UKICAgIHtyZXR1cm4oMC4yKX0KfSkKIyByZWZpbmUgYW5ub3RhdGlvbiBvZiBjZDQgYW5kIGNkOCB0IGNlbGxzLCB0byBjb21iaW5lIGNlbGxzIHRvZ2V0aGVyCnN1YnNldF90bXAgPC0gd2hpY2goYW5ub3QkYmFzaWN0eXBlICVpbiUgYygndGNlbGxfY2Q0JywgJ3RjZWxsX2NkOCcpKQphbm5vdFtzdWJzZXRfdG1wLCdjbHVzdCddIDwtIGFubm90W3N1YnNldF90bXAsJ2Jhc2ljdHlwZSddCgoKdG1wIDwtIGFzLmRhdGEuZnJhbWUoY29udGFtWyxjKGJfY2VsbF90eXBlcyldKQp0bXAkbWF4dmFsIDwtIHVubGlzdChhcHBseSh0bXAsIDEsIG1heCkpCgpnZ3Bsb3QodG1wLCBhZXMoeCA9IG1heHZhbCkpICsgZ2VvbV9kZW5zaXR5KCkKCmBgYAoKYGBge3IgRmlsdGVyIGdlbmVzfQoKIyBEZWZpbmUgY29udGFtaW5hdGVkIGdlbmVzIGZvciBCIGNlbGxzCmJfY2VsbF91bmNvbnRhbSA8LSByb3cubmFtZXMoCiAgZGF0YS5mcmFtZSghKGNvbnRhbVssYl9jZWxsX3R5cGVzXSkpICU+JSAKICAgIGZpbHRlcl9hbGwoYWxsX3ZhcnMoLikpCikKCgpgYGAKCgoKIyMgQ29tcHV0ZSBQQ0EgYW5kIGdlbmVyYXRlIFVNQVAKV2lsbCB1c2UgU2V1cmF0IHRvIG9idGFpbiBVTUFQIHRvIGNsdXN0ZXIgY2VsbHMKCmBgYHtyfQojIENyZWF0IFNldXJhdCBPYmplY3QKIyMgcHJlcGFyZSBhbGwgYW5ub3RhdGlvbnMKYW5ub3QkY29udGV4dCA8LSBjb250ZXh0W2Fubm90JGNlbGxfSURdCmFubm90IDwtIGJpbmRfY29scyhhbm5vdCwgY2Fubm90W2Fubm90JGNlbGxfSUQsYygnaW4uZ2xvbScsICdpbnNpZGUuZ2xvbScsJ3Bvc2l0aW9uLnZzLmdsb20nLCAnY2xvc2VzdC5nbG9tJyldKQojIyBCLWNlbGxzCmJjZWxsX3NldXJhdCA8LSBDcmVhdGVTZXVyYXRPYmplY3QoCiAgY291bnRzID0gcmF3W2MoYl9jZWxsX3VuY29udGFtLCAnSEJCJyksXSwKICBwcm9qZWN0ID0gIkxOX3NwYXRpYWwiLAogIGFzc2F5ID0gIm5hbm9zdHJSTkEiLAogIG1ldGEuZGF0YSA9IGFubm90CikKCiMjIyBvbmx5IEItY2VsbCBhbm5vdGF0aW9uCmJjZWxsX3NldXJhdCA8LSBzdWJzZXQoYmNlbGxfc2V1cmF0LAogICAgICAgICAgICAgICAgICAgICAgIHN1YnNldCA9IGNsdXN0ICVpbiUgYl9jZWxsX3R5cGVzKQoKIyBTY2FsZSBkYXRhCmJjZWxsX3NldXJhdEBtZXRhLmRhdGEkbG9nMTB0b3RhbGNvdW50cyA8LSBzYXBwbHkoYmNlbGxfc2V1cmF0QG1ldGEuZGF0YSRuQ291bnRfbmFub3N0clJOQSwgbG9nMTApCmJjZWxsX3NldXJhdCA8LSBTY2FsZURhdGEoYmNlbGxfc2V1cmF0LCAKICAgICAgICAgICAgICAgICAgICAgICAgICBmZWF0dXJlcyA9IGMoYl9jZWxsX3VuY29udGFtLCAnSEJCJyksCiAgICAgICAgICAgICAgICAgICAgICAgICAgbW9kZWwudXNlID0gJ25lZ2Jpbm9tJywKICAgICAgICAgICAgICAgICAgICAgICAgICB2YXJzLnRvLnJlZ3Jlc3MgPSAnbG9nMTB0b3RhbGNvdW50cycpCgojIyBuZWdhdGl2ZSB2YWx1ZXMgaW4gdGhlIFNjYWxlIERhdGEgY29sdW1uIGNvcnJlc3BvbmQgdG8gMCB2YWx1ZXMgaW4gdGhlIGV4cHJlc3Npb24gZGF0YS4gUmF0aGVyIHRoYW4gbGV0IHBzZXVkb2NvdW50cyBjYXVzZSAibmVnYXRpdmUgZ2VuZSBleHByZXNzaW9uIiwgdGhlc2UgdmFsdWVzIHNob3VsZCBiZSBjb3JyZWN0ZWQgdG8gYmUgemVybwp0cnVfdmFsIDwtIGFzLnZlY3RvcihiY2VsbF9zZXVyYXRAYXNzYXlzJG5hbm9zdHJSTkFAY291bnRzKQpzY2FsZWQgPC0gYXMudmVjdG9yKGJjZWxsX3NldXJhdEBhc3NheXMkbmFub3N0clJOQUBzY2FsZS5kYXRhKQp0b3Bsb3QgPC0gZGF0YS5mcmFtZShjb3VudHMgPSB0cnVfdmFsLAogICAgICAgICAgICAgICAgICAgICBzY2FsZWQgPSBzY2FsZWQpCgpnZ3Bsb3QodG9wbG90LCBhZXMoeCA9IGNvdW50cywgeSA9IHNjYWxlZCkpICsgZ2VvbV9wb2ludChhbHBoYSA9IDAuMiwgc2l6ZSA9IDAuMikKCiMgTWFrZSBhbGwgc2NhbGVkIHZhbHVlcyA8IDAgZXF1YWwgMCAKYmNlbGxfc2V1cmF0QGFzc2F5cyRuYW5vc3RyUk5BQHNjYWxlLmRhdGFbd2hpY2goYmNlbGxfc2V1cmF0QGFzc2F5cyRuYW5vc3RyUk5BQHNjYWxlLmRhdGEgPCAwKV0gPC0gMAoKIyBGaWx0ZXIgSEJCKyBjZWxscwojIyBEaXN0CmNlbGxzX2luX2RhdGEgPC0gY29sbmFtZXMoYmNlbGxfc2V1cmF0KQoKdG1wIDwtIGRhdGEuZnJhbWUoY2VsbF9JRCA9IGNlbGxzX2luX2RhdGEsCiAgICAgICAgICAgICAgICAgIEhCQiA9IGJjZWxsX3NldXJhdEBhc3NheXMkbmFub3N0clJOQUBzY2FsZS5kYXRhWydIQkInLCBjZWxsc19pbl9kYXRhXSwKICAgICAgICAgICAgICAgICAgSEJBID0gYmNlbGxfc2V1cmF0QGFzc2F5cyRuYW5vc3RyUk5BQHNjYWxlLmRhdGFbJ0hCQTEnLCBjZWxsc19pbl9kYXRhXSkKCmdncGxvdCh0bXAsIGFlcyh4ID0gSEJBLCB5ID0gSEJCKSkgKyBnZW9tX3BvaW50KCkKCkhCX2NlbGxzIDwtIHRtcFt3aGljaCgodG1wJEhCQSA+IDIuNSkgfAogICAgICAgICAgICAgICAgICAgICAgICB0bXAkSEJCID4gMi41KSwgJ2NlbGxfSUQnXQpub25IQl9jZWxscyA8LSB0bXAkY2VsbF9JRFt3aGljaCghKHRtcCRjZWxsX0lEICVpbiUgSEJfY2VsbHMpKV0KCiMjIyB1cGRhdGUgYW5ub3QgdG8gaW5jbHVkZSByYmNzCmFubm90W3doaWNoKGFubm90JGNlbGxfSUQgJWluJSBIQl9jZWxscyksJ2Jhc2ljdHlwZSddIDwtICdyYmMnCmFubm90W3doaWNoKGFubm90JGNlbGxfSUQgJWluJSBIQl9jZWxscyksJ2NsdXN0J10gPC0gJ3JiYycKCiMjIyBObyBIQiBjZWxscwpiY2VsbF9zZXVyYXQgPC0gc3Vic2V0KGJjZWxsX3NldXJhdCwKICAgICAgICAgICAgICAgICAgICAgICBzdWJzZXQgPSBjZWxsX0lEICVpbiUgbm9uSEJfY2VsbHMpCgojIyMgTm8gaGVtb2dsb2JpbiBnZW5lIGV4cHJlc3Npb24KYWxsX2dlbmVzIDwtIHJvdy5uYW1lcyhiY2VsbF9zZXVyYXQpCmJjZWxsX3NldXJhdCA8LSBzdWJzZXQoYmNlbGxfc2V1cmF0LAogICAgICAgICAgICAgICAgICAgICAgIGZlYXR1cmVzID0gYWxsX2dlbmVzW3doaWNoKCEoYWxsX2dlbmVzICVpbiUgYygnSEJCJywgJ0hCQTEnKSkpXSkKYmNlbGxfYWxsLmdlbmVzIDwtIHJvd25hbWVzKGJjZWxsX3NldXJhdCkKCiMgUnVuIFBDQQojIyBCLWNlbGxzCmJjZWxsX3NldXJhdCA8LSBSdW5QQ0EoYmNlbGxfc2V1cmF0LCBmZWF0dXJlcyA9IGJjZWxsX2FsbC5nZW5lcywgbnBjcz0yMCkKRWxib3dQbG90KGJjZWxsX3NldXJhdCwgbmRpbXM9MjApCmJjZWxsX3NldXJhdCA8LSBSdW5VTUFQKGJjZWxsX3NldXJhdCwgZGltcyA9IDE6MjApCgojIFJ1biBVTUFQCiMjIEItY2VsbHMKYmNlbGxfc2V1cmF0IDwtIEZpbmROZWlnaGJvcnMoYmNlbGxfc2V1cmF0LCBkaW1zID0gMToyMCkKYmNlbGxfc2V1cmF0IDwtIEZpbmRDbHVzdGVycyhiY2VsbF9zZXVyYXQsIHJlc29sdXRpb24gPSAxKQpiY2VsbF9zZXVyYXQgPC0gQWRkTWV0YURhdGEoYmNlbGxfc2V1cmF0LAogICAgICAgICAgICAgICAgICBkYXRhLmZyYW1lKGJjZWxsX3NldXJhdEByZWR1Y3Rpb25zJHVtYXBAY2VsbC5lbWJlZGRpbmdzKSkKCkRpbVBsb3QoYmNlbGxfc2V1cmF0LCByZWR1Y3Rpb24gPSAndW1hcCcpICsgcGxvdF9hbm5vdGF0aW9uKHRpdGxlPSdCLWNlbGwgUENBIENsdXN0ZXJzJykKZ2dwbG90KGJjZWxsX3NldXJhdEBtZXRhLmRhdGEsCiAgICAgICBhZXMoeD1VTUFQXzEsIAogICAgICAgICAgIHk9VU1BUF8yLAogICAgICAgICAgIGNvbG9yPWxvZzEwdG90YWxjb3VudHMpKSArCiAgZ2VvbV9wb2ludChzaXplPTAuNSkgKwogIGdndGl0bGUoJ0ItY2VsbCBVTUFQIHdpdGggUk5BIENvdW50cycpCiAgCgpgYGAKCiMgU3ViY2x1c3RlciBjZWxscyB3aXRoIE1MRQojIyBVc2UgTUxFY2VsbAoKYGBge3IgU3ViY2x1c3RlciBjZWxscywgbWVzc2FnZT1GQUxTRX0KIyBiIGNlbGwgc3ViY2x1c3RlcmluZwpiY2VsbF9jb2xzIDwtIHdoaWNoKGNsdXN0ICVpbiUgYl9jZWxsX3R5cGVzKQpiY2VsbF9jbnRzIDwtIHJhd1tiX2NlbGxfdW5jb250YW0sYmNlbGxfY29sc10KYmNlbGxfbmVnbSA8LSBhbm5vdFtiY2VsbF9jb2xzLCduZWdtZWFuJ10KYmNlbGxfY29obyA8LSBmYXN0Q29ob3J0aW5nKGFubm90W2JjZWxsX2NvbHMsIGMoJ0FyZWEnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnQXNwZWN0UmF0aW8nLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnTWVhbi5QYW5DSycsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnTWVhbi5DRDQ1JywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ01lYW4uREFQSScpXSwKICAgICAgICAgICAgICAgICAgICAgICAgZ2F1c3NpYW5fdHJhbnNmb3JtID0gVFJVRSkgCgpiY2VsbF91bnN1cCA8LSBpbnNpdHV0eXBlKGNvdW50cyA9IHQoYXMubWF0cml4KGJjZWxsX2NudHMpKSwKICAgICAgICAgICAgICAgICAgICAgICAgICBuZWcgPSBiY2VsbF9uZWdtLAogICAgICAgICAgICAgICAgICAgICAgICAgIGNvaG9ydCA9IGJjZWxsX2NvaG8sCiAgICAgICAgICAgICAgICAgICAgICAgICAgYmcgPSBOVUxMLCAKICAgICAgICAgICAgICAgICAgICBuX2NsdXN0cyA9IGMoMiwgNCksCiAgICAgICAgICAgICAgICAgICAgcmVmZXJlbmNlX3Byb2ZpbGVzID0gTlVMTCwgIyBOVUxMIHZhbHVlIHJ1bnMgdW5zdXBlcnZpc2VkIGNsdXN0ZXJpbmcKICAgICAgICAgICAgICAgICAgICApIApgYGAKCiMjIE1MRSBoZWF0bWFwCgpgYGB7ciBIZWF0bWFwcyBvZiBPcmlnaW5hbCBDbHVzdGVyaW5nfQojIEItY2VsbCBoZWF0bWFwCnN0cihiY2VsbF91bnN1cCkKcm91bmQoaGVhZChiY2VsbF91bnN1cCRwcm9iKSwyKQoKYmNlbGxfaG0gPC0gaGVhdG1hcChzd2VlcChiY2VsbF91bnN1cCRwcm9maWxlcywKICAgICAgICAgICAgICAgICAgICAgICAgICAxLAogICAgICAgICAgICAgICAgICAgICAgICAgIHBtYXgoYXBwbHkoYmNlbGxfdW5zdXAkcHJvZmlsZXMsIDEsIG1heCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuMiksCiAgICAgICAgICAgICAgICAgICAgICAgICAgIi8iKSwKICAgICAgICAgICAgICAgICAgICBzY2FsZSA9ICJub25lIiwKICAgICAgICAgICAgICAgICAgICBtYWluID0gIkItY2VsbCBTdWJjbHVzdGVyIE1lYW4gRXhwcmVzc2lvbiBQcm9maWxlcyIpCgpgYGAKIyMgRmxpZ2h0cGF0aCBwbG90CgpgYGB7ciBGbGlnaHRwYXRoIFBsb3RzfQojIyBCLWNlbGxzCiMgZGVmaW5lIGNsdXN0ZXIgY29sb3JzOgpjb2xzIDwtIGMoJyNhNmNlZTMnLCcjMWY3OGI0JywnI2IyZGY4YScsJyMzM2EwMmMnKQpjb2xzIDwtIGNvbHNbc2VxX2Fsb25nKHVuaXF1ZShiY2VsbF91bnN1cCRjbHVzdCkpXQpuYW1lcyhjb2xzKSA8LSB1bmlxdWUoYmNlbGxfdW5zdXAkY2x1c3QpCgojIG1ha2UgdGhlIGZsaWdodHBhdGggcGxvdApmcCA8LSBmbGlnaHRwYXRoX3Bsb3QoZmxpZ2h0cGF0aF9yZXN1bHQgPSBOVUxMLCBpbnNpdHV0eXBlX3Jlc3VsdCA9IGJjZWxsX3Vuc3VwLCBjb2wgPSBjb2xzW2JjZWxsX3Vuc3VwJGNsdXN0XSkKY2xhc3MoZnApCnByaW50KGZwKQpnZ3NhdmUoZnAsIGZpbGU9ImZpZ3VyZXMvYmNlbGxfTUxFY2VsbF9mcC5wbmciKQoKYGBgCgoKIyMgQ29tcGFyZSBNTEVjZWxsIGFuZCBVTUFQCgpgYGB7ciBNTEVjZWxsIFN1YmNsdXN0ZXJzIG9uIFVNQVB9CiMgQi1jZWxscwpiY2VsbF9zZXVyYXQgPC0gQWRkTWV0YURhdGEoYmNlbGxfc2V1cmF0LCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEuZnJhbWUoYmNlbGxfdW5zdXAkY2x1c3QpKQoKIyByZW5hbWUgc3ViY2x1c3RlciBpZGVudGl0eQpuZXcgPSBjKCdCLjQnLCdCLjEnLCdCLjMnLCdCLjInKQpuZXcgPSBmYWN0b3IobmV3LCBsZXZlbHMgPSBjKCdCLjEnLCAnQi4yJywgJ0IuMycsICdCLjQnKSkKa2V5ID0gZGF0YS5mcmFtZShvbGQgPSBsZXR0ZXJzWzE6NF0sCiAgICAgICAgICAgICAgICAgbmV3ID0gbmV3KQoKYmNlbGxfc2V1cmF0QG1ldGEuZGF0YSRiY2VsbF9zdWJjbHVzdCA8LSBzYXBwbHkoYmNlbGxfc2V1cmF0QG1ldGEuZGF0YSRiY2VsbF91bnN1cC5jbHVzdCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24obykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybihrZXlbd2hpY2goa2V5JG9sZCA9PSBvKSwnbmV3J10pCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pCgpiY2VsbF9zZXVyYXRAbWV0YS5kYXRhJGJjZWxsX3N1YmNsdXN0IDwtIGZhY3RvcihiY2VsbF9zZXVyYXRAbWV0YS5kYXRhJGJjZWxsX3N1YmNsdXN0KQoKYmNlbGxjb2xzIDwtIGMoJyM2NmMyYTUnLCcjZmM4ZDYyJywnIzhkYTBjYicsJyNlNzhhYzMnKQoKZ2dwbG90KGJjZWxsX3NldXJhdEBtZXRhLmRhdGEsCiAgICAgICBhZXMoeD1VTUFQXzEseT1VTUFQXzIsY29sb3I9YmNlbGxfc3ViY2x1c3QpKSArCiAgZ2VvbV9wb2ludChzaXplPTEpICsKICBzY2FsZV9jb2xvcl9tYW51YWwodmFsdWVzID0gYmNlbGxjb2xzKQoKZ2dzYXZlKCdmaWd1cmVzL2JjZWxsX01MRWNlbGxfc3ViY2x1c3RzX1VNQVBzcGFjZS5wbmcnLAogICAgICAgaGVpZ2h0PTUuNSkKCnNhdmVSRFMoYmNlbGxfc2V1cmF0LCAKICAgICAgICBmaWxlID0gJ3Byb2Nlc3NlZF9kYXRhL2JjZWxsX3NldXJhdC5SRFMnKQpgYGAKCiMjIFB1YiBVTUFQIHBsb3QgCgojIyMgRGV0ZXJtaW5lIHJlYXNvbmFibGUgY291bnQgZmlsdGVyCgpgYGB7cn0KbGFwcGx5KHNlcShmcm9tID0gMS41LCB0byA9IDIuNSwgYnkgPTAuMSksIGZ1bmN0aW9uKHgpIHsKICBwcmludCh4KQogIAogICMgZmlsdGVyIGFuZCByZXNjYWxlIHRoZSBkYXRhCiAgdGVtcF9zZXVyYXQgPC0gU2NhbGVEYXRhKHN1YnNldChiY2VsbF9zZXVyYXQsIHN1YnNldCA9IGxvZzEwdG90YWxjb3VudHMgPiB4KSwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgZmVhdHVyZXMgPSBjKGJjZWxsX2FsbC5nZW5lcyksCiAgICAgICAgICAgICAgICAgICAgICAgICAgbW9kZWwudXNlID0gJ25lZ2Jpbm9tJywKICAgICAgICAgICAgICAgICAgICAgICAgICB2YXJzLnRvLnJlZ3Jlc3MgPSAnbG9nMTB0b3RhbGNvdW50cycpCiAgIyBSdW4gUENBCiAgdGVtcF9zZXVyYXQgPC0gUnVuUENBKHRlbXBfc2V1cmF0LCBmZWF0dXJlcyA9IGJjZWxsX2FsbC5nZW5lcywgbnBjcz0yMCkKICAjIFJ1biBVTUFQCiAgdGVtcF9zZXVyYXQgPC0gUnVuVU1BUCh0ZW1wX3NldXJhdCwgZGltcyA9IDE6MjApCiAgIyBQbG90CiAgSWRlbnRzKG9iamVjdCA9IHRlbXBfc2V1cmF0KSA8LSB0ZW1wX3NldXJhdEBtZXRhLmRhdGEkJ2JjZWxsX3Vuc3VwLmNsdXN0JyAKICBEaW1QbG90KHRlbXBfc2V1cmF0LAogICAgICAgICAgcmVkdWN0aW9uID0gJ3VtYXAnLAogICAgICAgICAgKSArIHBsb3RfYW5ub3RhdGlvbih0aXRsZT1wYXN0ZTAoJ0ItY2VsbCBTdWJjbHVzdGVycywgbG9nIFJOQSBjb3VudCA+JywgeCkpCn0pCgpgYGAKCmNlbGxzIHdpdGggPiA4MCBSTkEgY291bnRzIHNlZW0gdG8gZG8gYmVzdAoKIyMjIFBsb3QgVU1BUAoKYGBge3J9CiNmaWx0ZXIgYnkgbmNvdW50cwpiY2VsbF9zZXVyYXRfZmlsIDwtIHN1YnNldChiY2VsbF9zZXVyYXQsIHN1YnNldCA9IGxvZzEwdG90YWxjb3VudHMgPiAxLjkpCgojcnVuIFVNQVAKYmNlbGxfc2V1cmF0X2ZpbCA8LSBSdW5QQ0EoYmNlbGxfc2V1cmF0X2ZpbCwgZmVhdHVyZXMgPSBiY2VsbF9hbGwuZ2VuZXMsIG5wY3M9MjApCmJjZWxsX3NldXJhdF9maWwgPC0gUnVuVU1BUChiY2VsbF9zZXVyYXRfZmlsLCBkaW1zID0gMToyMCkKSWRlbnRzKG9iamVjdCA9IGJjZWxsX3NldXJhdF9maWwpIDwtIGJjZWxsX3NldXJhdF9maWxAbWV0YS5kYXRhJCdiY2VsbF9zdWJjbHVzdCcgCgojIHJlbW92ZSBvbGQgVU1BUCBjb2xzIGZyb20gbWV0YWRhdGEKYmNlbGxfc2V1cmF0X2ZpbEBtZXRhLmRhdGEgPC0gYmNlbGxfc2V1cmF0X2ZpbEBtZXRhLmRhdGFbLHdoaWNoKCEoY29sbmFtZXMoYmNlbGxfc2V1cmF0X2ZpbEBtZXRhLmRhdGEpICVpbiUgYygnVU1BUF8xJywgJ1VNQVBfMicpKSldCgojIEFkZCBuZXcgVU1BUCBjb2xzCmJjZWxsX3NldXJhdF9maWwgPC0gQWRkTWV0YURhdGEoYmNlbGxfc2V1cmF0X2ZpbCwKICAgICAgICAgICAgICAgICAgZGF0YS5mcmFtZShiY2VsbF9zZXVyYXRfZmlsQHJlZHVjdGlvbnMkdW1hcEBjZWxsLmVtYmVkZGluZ3MpKQoKCiMgTWFrZSBzdXJlIGl0J3Mgbm90IHRvbyBiYXRjaHkKZ2dwbG90KGJjZWxsX3NldXJhdF9maWxAbWV0YS5kYXRhLAogICAgICAgYWVzKHg9VU1BUF8xLCAKICAgICAgICAgICB5PVVNQVBfMiwKICAgICAgICAgICBjb2xvcj10aXNzdWVuYW1lKSkgKwogIGdlb21fcG9pbnQoc2l6ZT0xKSArCiAgZmFjZXRfd3JhcCh+dGlzc3VlbmFtZSkgKwogIHRoZW1lKGF4aXMudGl0bGUueSA9IGVsZW1lbnRfYmxhbmsoKSwKICAgICAgICBheGlzLnRpdGxlLnggPSBlbGVtZW50X2JsYW5rKCkpCgojIFBsb3QKZ2dwbG90KGJjZWxsX3NldXJhdF9maWxAbWV0YS5kYXRhLAogICAgICAgYWVzKHg9VU1BUF8xLCAKICAgICAgICAgICB5PVVNQVBfMiwKICAgICAgICAgICBjb2xvcj1iY2VsbF9zdWJjbHVzdCkpICsKICBnZW9tX3BvaW50KHNpemU9MSkgKwogIHNjYWxlX2NvbG9yX21hbnVhbCh2YWx1ZXMgPSBiY2VsbGNvbHMsCiAgICAgICAgICAgICAgICAgICAgZ3VpZGUgPSBndWlkZV9sZWdlbmQodGl0bGUgPSAiQi1jZWxsXG5zdWJjbHVzdGVyIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrZXloZWlnaHQgPSAwLjUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga2V5d2lkdGggPSAwLjUpKSArCiAgdGhlbWUoYXhpcy50aXRsZS55ID0gZWxlbWVudF9ibGFuaygpLAogICAgICAgIGF4aXMudGl0bGUueCA9IGVsZW1lbnRfYmxhbmsoKSkKCmdnc2F2ZShmaWxlID0gJ2ZpZ3VyZXMvYmNlbGxzdWJjbHVzdF9VTUFQLnN2ZycsCiAgICAgICB3aWR0aCA9IDQsCiAgICAgICBoZWlnaHQgPSAzLAogICAgICAgZGV2aWNlID0gc3ZnKQoKCiMgUGxvdCBwbGFzbWFibGFzdCBhbmQgQi1jZWxsIGlkZW50aXR5CmdncGxvdChiY2VsbF9zZXVyYXRfZmlsQG1ldGEuZGF0YSwKICAgICAgIGFlcyh4PVVNQVBfMSwgCiAgICAgICAgICAgeT1VTUFQXzIsCiAgICAgICAgICAgY29sb3I9Y2x1c3QpKSArCiAgZ2VvbV9wb2ludChzaXplPTEpICsKICBzY2FsZV9jb2xvcl9tYW51YWwodmFsdWVzID0gYmNlbGxjb2xzLAogICAgICAgICAgICAgICAgICAgIGd1aWRlID0gZ3VpZGVfbGVnZW5kKHRpdGxlID0gIlBhdHJpY2tcbmNlbGwgdHlwZXMiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtleWhlaWdodCA9IDAuNSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrZXl3aWR0aCA9IDAuNSkpICsKICB0aGVtZShheGlzLnRpdGxlLnkgPSBlbGVtZW50X2JsYW5rKCksCiAgICAgICAgYXhpcy50aXRsZS54ID0gZWxlbWVudF9ibGFuaygpKQoKZ2dzYXZlKGZpbGUgPSAnZmlndXJlcy9iY2VsbFBsYXNtYV9VTUFQLnN2ZycsCiAgICAgICB3aWR0aCA9IDQsCiAgICAgICBoZWlnaHQgPSAzLAogICAgICAgZGV2aWNlID0gc3ZnKQoKCmBgYAoKIyBTdWJjbHVzdGVyIHZzIG90aGVyIHZhcmlhYmxlcwoKIyMgQ29udGludW91cyB2YXJpYWJsZXMKCmBgYHtyIEFzc2VzcyBDb250aW51b3VzIFZhcmlhYmxlcywgbWVzc2FnZT1GQUxTRX0KIyMgZGVmaW5lIGNvbnRpbnVvdXMgdmFyaWFibGVzCmNvbnR2YXJzIDwtIGxpc3QoInRvdGFsY291bnRzIiwgIkFyZWEiLCAiTWVhbi5QYW5DSyIsICJNYXguUGFuQ0siLCAiTWVhbi5DRDQ1IiwgIk1heC5DRDQ1IiwgIk1lYW4uREFQSSIsICJNYXguREFQSSIpCgoKIyMgQi1jZWxscwojIE1MRS1jZWxsIHZzIGNvbnRpbnVvdXMgdmFyaWFibGVzCnBsdHMgPC0gbGFwcGx5KGNvbnR2YXJzLCBmdW5jdGlvbihkKSB7CiAgZ2dwbG90KGJjZWxsX3NldXJhdEBtZXRhLmRhdGEsCiAgICAgICAgIGFlc19zdHJpbmcoeCA9ICJiY2VsbF9zdWJjbHVzdCIsCiAgICAgICAgICAgICAgICAgICAgeSA9IGQpKSArIGdlb21fdmlvbGluKCkgKwogICAgZ2VvbV9qaXR0ZXIoc2l6ZSA9IDAuNSwgYWxwaGEgPSAwLjEpICsKICAgIHNjYWxlX3lfY29udGludW91cyh0cmFucz0nbG9nMTAnKQogIAp9KQoKcGx0cyA8LSBnZ2FycmFuZ2UocGxvdGxpc3Q9cGx0cywgbGFiZWxzID0gY29udHZhcnMsIGNvbW1vbi5sZWdlbmQgPSBGKQpnZ3NhdmUoZmlsZW5hbWUgPSAnZmlndXJlcy9iY2VsbF9NTEVjZWxsc3ViY2x1c3RzX2NvbnR2YXJfbWV0YWRhdHMucG5nJywKICAgICAgIHBsdHMsCiAgICAgICB3aWR0aCA9IDIwLAogICAgICAgaGVpZ2h0ID0gMTQpCmBgYAoKCiMjIERpc2NyZXRlIHZhcmlhYmxlcwoKYGBge3IgQXNzZXNzIERpc2NyZXRlIFZhcmlhYmxlcywgbWVzc2FnZT1GQUxTRX0KIyMgRGVmaW5lIGRpc2NyZXRlIHZhcmlhYmxlcwpkaXNjdmFycyA8LSBsaXN0KCJ0aXNzdWVuYW1lIiwgImNsYXNzIiwgImNsdXN0IiwgJ2NvbnRleHQnLCAncG9zaXRpb24udnMuZ2xvbScpCgojIyBCLWNlbGxzCnBsdHMgPC0gbGFwcGx5KGRpc2N2YXJzLCBmdW5jdGlvbihkKSB7CiAgZ2dwbG90KGJjZWxsX3NldXJhdEBtZXRhLmRhdGEsCiAgICAgICAgIGFlc19zdHJpbmcoeCA9ICJiY2VsbF9zdWJjbHVzdCIsIGZpbGwgPSBkKSkgKwogICAgZ2VvbV9iYXIoKQogIAp9KQoKcGx0cyA8LSBnZ2FycmFuZ2UocGxvdGxpc3Q9cGx0cywKICAgICAgICAgICAgICAgICAgbGFiZWxzID0gZGlzY3ZhcnMsIAogICAgICAgICAgICAgICAgICBjb21tb24ubGVnZW5kID0gRikKCmdnc2F2ZShmaWxlbmFtZSA9ICdmaWd1cmVzL2JjZWxsX01MRWNlbGxfZGlzY3Zhcl9tZXRhZGF0cy5wbmcnLAogICAgICAgcGx0cywKICAgICAgIHdpZHRoID0gMjAsCiAgICAgICBoZWlnaHQgPSAxNSkKYGBgCgoKIyMgTHVwdXMgY2xhc3MKCmBgYHtyIExvb2sgYXQgTHVwdXMgQ2xhc3MsIG1lc3NhZ2U9RkFMU0V9CiMgQi1jZWxscwojIyBsb29rIGF0IG92ZXItcmVwcmVzZW50YXRpb24gb2YgY2x1c3RlcnMgaW4gZWFjaCBjbGFzcwpiY2VsbF91bnN1cF9sdXB1c2NsYXNzX2NoaXNxIDwtIGNoaXNxLnRlc3QodGFibGUoYmNlbGxfc2V1cmF0QG1ldGEuZGF0YSRjbGFzcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJjZWxsX3NldXJhdEBtZXRhLmRhdGEkYmNlbGxfc3ViY2x1c3QpKQpiY2VsbF91bnN1cF9sdXB1c2NsYXNzX2NoaXNxX3JlcyA8LSBtZWx0KGJjZWxsX3Vuc3VwX2x1cHVzY2xhc3NfY2hpc3EkcmVzaWR1YWxzKQpjb2xuYW1lcyhiY2VsbF91bnN1cF9sdXB1c2NsYXNzX2NoaXNxX3JlcykgPC0gYygnY2xhc3MnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnY2x1c3RlcicsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdyZXNpZHVhbCcpCgpiY2VsbF91bnN1cF9sdXB1c2NsYXNzX2NoaXNxX3JlcyAlPiUgCiAgYXJyYW5nZShwbHlyOjpkZXNjKHJlc2lkdWFsKSkKCiMjIG1vc3Qgb3Zlci1yZXByZXNlbnRlZCBjZWxsIHN1YnNldCBpbiBlYWNoIGNsdXN0ZXIsIGFsb25nIHdpdGggcmVzaWR1YWwKYmNlbGxfdW5zdXBfY2xhc3Nfb3ZlcnJlcCA8LSBiY2VsbF91bnN1cF9sdXB1c2NsYXNzX2NoaXNxX3JlcyAlPiUKICBncm91cF9ieShjbHVzdGVyKSAlPiUKICBzbGljZV9tYXgobj0xLCBvcmRlcl9ieT1yZXNpZHVhbCkgJT4lCiAgc3VtbWFyaXplKGNsdXN0ZXI9Y2x1c3RlciwgY2xhc3M9Y2xhc3MsIG1heF9yZXNpZHVhbD1yZXNpZHVhbCwgKQoKIyMgcGxvdCBjbGFzcyB2cyBjbHVzdGVyIHdpdGggdW5kZXJseWluZyBwbG90IG9mIHRoZSBjbGFzcyBtb3N0IG92ZXItcmVwcmVzZW50ZWQgYW5kIGl0cyBjaGktc3EgcmVzaWR1YWwKIyMgTW9zdCBpbnRlcmVzdGluZyBhcmUgYywgZSwgaCwgbSwgYW5kIHQgKHJlc2lkdWFscyA+IDUpCmdncGxvdCgpICsKICBnZW9tX2JhcihkYXRhPWJjZWxsX3NldXJhdEBtZXRhLmRhdGEsCiAgICAgICAgICAgY29sb3I9ImJsYWNrIiwKICAgICAgICAgICBhZXMoeD1iY2VsbF9zdWJjbHVzdCwKICAgICAgICAgICAgICAgZmlsbD1jbGFzcykpICsKICBnZW9tX3BvaW50KGRhdGE9YmNlbGxfdW5zdXBfY2xhc3Nfb3ZlcnJlcCwKICAgICAgICAgICAgIGNvbG9yPSJibGFjayIsCiAgICAgICAgICAgICBzaGFwZT0yMSwKICAgICAgICAgICAgIGFlcyh4PWNsdXN0ZXIsCiAgICAgICAgICAgICAgICAgeT0tMzAsCiAgICAgICAgICAgICAgICAgZmlsbD1jbGFzcywKICAgICAgICAgICAgICAgICBzaXplPW1heF9yZXNpZHVhbCkpICsKICBsYWJzKHRpdGxlID0gJ0ItY2VsbCBTdWJjbHVzdGVyIFByZXZhbGVuY2UgYWNyb3NzIEx1cHVzIE5lcGhyaXRpcyBDbGFzc2VzJykgKwogIHlsYWIoJ051bWJlciBvZiBjZWxscycpICsKICB4bGFiKCdCLWNlbGwgc3VibHVzdGVyIElEJykgKwogIGd1aWRlcyhmaWxsPWd1aWRlX2xlZ2VuZCh0aXRsZT0iTE4gQ2xhc3MiKSwKICAgICAgICAgc2l6ZT1ndWlkZV9sZWdlbmQodGl0bGU9J0NoaVNxIFJlc2lkdWFsJykpCgpnZ3NhdmUoJ2ZpZ3VyZXMvYmNlbGxfc3ViY2x1c3RlcklEdnNMTkNsYXNzLnBuZycpCgoKIyBvaywgc2NyZXcgdGhhdC4gTGV0J3MgZG8gYSBkaXNlYXNlZCB2cyB1bmRpc2Vhc2VkIHRlc3QgZmlyc3QgaW5zdGVhZApiY2VsbF9zZXVyYXRAbWV0YS5kYXRhJGRpc2Vhc2UgPSAnTE4nCmJjZWxsX3NldXJhdEBtZXRhLmRhdGFbd2hpY2goYmNlbGxfc2V1cmF0QG1ldGEuZGF0YSRjbGFzcyA9PSAnY29udHJvbCcpLCdkaXNlYXNlJ10gPC0gJ0NvbnRyb2wnCgpiY2VsbF9zdWJjbHVzdF9jaGlzcV9keiA8LSBiaW5kX3Jvd3MobGFwcGx5KG5ldywgZnVuY3Rpb24oY2wpIHsKICBwcmludChjbCkKICBkZiA8LSBiY2VsbF9zZXVyYXRAbWV0YS5kYXRhCiAgZGYkY2wgPC0gY2wKICBkZiRjbCA8LSBhcy5jaGFyYWN0ZXIoZGYkY2wpCiAgZGZbd2hpY2goZGYkYmNlbGxfc3ViY2x1c3QgIT0gY2wpLCdjbCddIDwtICdvdGhlciBjbHVzdGVycycKICBjaGlzcSA8LSBjaGlzcS50ZXN0KHRhYmxlKGRmJGRpc2Vhc2UsIGRmJGNsKSkKICByZXR1cm4oY2JpbmQoZGF0YS5mcmFtZShzdWJjbHVzdGVyID0gY2wpLCBicm9vbTo6dGlkeShjaGlzcSkpKQogIAogIAp9KSkKCmJjZWxsX3N1YmNsdXN0X2NoaXNxX2R6JHAudmFsdWUuYWRqID0gcC5hZGp1c3QoYmNlbGxfc3ViY2x1c3RfY2hpc3FfZHokcC52YWx1ZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXRob2QgPSAnQkgnKQoKZmlnIDwtIGdncGxvdCgpICsKICBnZW9tX2JhcihkYXRhID0gYmNlbGxfc2V1cmF0QG1ldGEuZGF0YSwKICAgICAgICAgICBhZXMoeSA9IGRpc2Vhc2UsCiAgICAgICAgICAgICAgIGZpbGwgPSBiY2VsbF9zdWJjbHVzdCksCiAgICAgICAgICAgcG9zaXRpb24gPSAnZmlsbCcsCiAgICAgICAgICAgY29sb3IgPSAnYmxhY2snKSArCiAgZ2VvbV9wb2ludChkYXRhID0gZGF0YS5mcmFtZSh4PWMoMC4xNSwgMC42OSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB5PWMoJ2NvbnRyb2wnLCdzbGUnKSksCiAgICAgICAgICAgICBhZXMoeD14LHk9eSksCiAgICAgICAgICAgICBzaGFwZT04KSArCiAgc2NhbGVfZmlsbF9tYW51YWwodmFsdWVzID0gYmNlbGxjb2xzLAogICAgICAgICAgICAgICAgICAgIGd1aWRlID0gZ3VpZGVfbGVnZW5kKHRpdGxlID0gIkItY2VsbFxuc3ViY2x1c3RlciIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga2V5aGVpZ2h0ID0gMC41LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtleXdpZHRoID0gMC41KSkgKwogIHNjYWxlX3hfY29udGludW91cyhsYWJlbHMgPSBzY2FsZXM6OnBlcmNlbnQpICsKICB5bGFiKGxhYmVsID0gZWxlbWVudF9ibGFuaygpKSArCiAgeGxhYihsYWJlbCA9IGVsZW1lbnRfYmxhbmsoKSkKCgpnZ3NhdmUoZmlsZW5hbWUgPSAnZmlndXJlcy9iY2VsbF9zdWJjbHVzdF9sdXB1c2NsYXNzLnN2ZycsCiAgICAgICBwbG90ID0gZmlnLAogICAgICAgd2lkdGggPSAzLAogICAgICAgaGVpZ2h0ID0gMSwKICAgICAgIHVuaXRzID0gImluIiwKICAgICAgIGRldmljZSA9IHN2ZykKCmJjZWxsX3N1YmNsdXN0X2NoaXNxX2R6CgpgYGAKCgojIyBUdWJ1bG9pbnRlcnN0aXRpYWwgaG90c3BvdHMKYGBge3J9CmNvbnRleHQgPC0gcmVhZFJEUygncHJvY2Vzc2VkX2RhdGEvY29udGV4dDQuUkRTJykKY29udGV4dCA8LSBhbm5vdFssYygnY2VsbF9JRCcsICdjb250ZXh0JyldCiNiY2VsbF9zZXVyYXRAbWV0YS5kYXRhIDwtIG1lcmdlKGJjZWxsX3NldXJhdEBtZXRhLmRhdGEsIGNvbnRleHQsIGJ5ID0gJ2NlbGxfSUQnKQoKZGYgPC0gbWVsdCh0YWJsZShiY2VsbF9zZXVyYXRAbWV0YS5kYXRhWywjd2hpY2goYmNlbGxfc2V1cmF0QG1ldGEuZGF0YSRkaXNlYXNlID09ICdMTicpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGMoJ2NvbnRleHQnLCAnYmNlbGxfc3ViY2x1c3QnLCAnZGlzZWFzZScpXSkpCgojIEdldCB0aGUgcGVyY2VudGFnZSBvZiBCLjMgY2VsbHMgaW4gaG90c3BvdHMsIGFuZCBvdmVyYWxsCmFsbF9jZWxsX3BlcmMgPC0gZGYgJT4lIGdyb3VwX2J5KGJjZWxsX3N1YmNsdXN0KSAlPiUgc3VtbWFyaXplKHN1bSh2YWx1ZSkvc3VtKGRmJHZhbHVlKSkKaG90c3BvdF9wZXJjIDwtIHN1YnNldChkZiwgY29udGV4dCA9PSAnaG90c3BvdCcpICU+JSBncm91cF9ieShiY2VsbF9zdWJjbHVzdCkgJT4lIHN1bW1hcml6ZShzdW0odmFsdWUpIC8gc3VtKGRmW3doaWNoKGRmJGNvbnRleHQgPT0gJ2hvdHNwb3QnKSwndmFsdWUnXSkpCgojIHBlcmZvcm0gYSBjaGlzcQpjaGlzcXRhYmxlIDwtIHRhYmxlKGRhdGEuZnJhbWUoCiAgQi4zID0gc2FwcGx5KGJjZWxsX3NldXJhdEBtZXRhLmRhdGEkYmNlbGxfc3ViY2x1c3QsIGZ1bmN0aW9uKGMpIHtjPT0nQi4zJ30pLAogIGhvdHNwb3QgPSBzYXBwbHkoYmNlbGxfc2V1cmF0QG1ldGEuZGF0YSRjb250ZXh0LCBmdW5jdGlvbihjKSB7Yz09J2hvdHNwb3QnfSkpKQpjaGlzcS50ZXN0KGNoaXNxdGFibGUsCiAgICAgICAgICAgICAgKQoKZmlnIDwtIGdncGxvdCgpICsKICBnZW9tX2JhcihkYXRhID0gYmNlbGxfc2V1cmF0QG1ldGEuZGF0YSwKICAgICAgICAgICBhZXMoeSA9IGJjZWxsX3N1YmNsdXN0LAogICAgICAgICAgICAgICBmaWxsID0gY29udGV4dCksCiAgICAgICAgICAgcG9zaXRpb24gPSAnZmlsbCcsCiAgICAgICAgICAgY29sb3IgPSAnYmxhY2snKSArCiAgc2NhbGVfZmlsbF9tYW51YWwodmFsdWVzID0gYygnIzgwYjFkMycsICcjZmI4MDcyJywgJyNiZWJhZGEnLCAnI2ZkYjQ2MicpKSArCiAgc2NhbGVfeF9jb250aW51b3VzKGxhYmVscyA9IHNjYWxlczo6cGVyY2VudCkgKwogIHlsYWIobGFiZWwgPSAnQi1jZWxsXG5TdWJjbHVzdGVyJykgKwogIHhsYWIobGFiZWwgPSBlbGVtZW50X2JsYW5rKCkpICsKICBsYWJzKGZpbGwgPSAiTG9jYXRpb24iKSArCiAgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gImJvdHRvbSIsCiAgICAgICAgbGVnZW5kLmtleS5zaXplID0gdW5pdCgwLjMsICJjbSIpLAogICAgICAgIGxlZ2VuZC5tYXJnaW4gPSBtYXJnaW4odCA9IC0wLjUsIHVuaXQgPSAiY20iKSwKICAgICAgICBsZWdlbmQudGl0bGUgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDEwKSkgKwogIGd1aWRlcyhmaWxsID0gZ3VpZGVfbGVnZW5kKHRpdGxlLnBvc2l0aW9uID0gJ3RvcCcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnJvdyA9IDQpKQoKZ2dzYXZlKGZpbGVuYW1lID0gJ2ZpZ3VyZXMvYmNlbGxfc3ViY2x1c3RfaG90c3BvdHMuc3ZnJywKICAgICAgIHBsb3QgPSBmaWcsCiAgICAgICB3aWR0aCA9IDIsCiAgICAgICBoZWlnaHQgPSAyLAogICAgICAgdW5pdHMgPSAiaW4iLAogICAgICAgZGV2aWNlID0gc3ZnKQoKYGBgCgoKIyBTdWJjbHVzdGVyIERFR3MKCiMjIElkZW50aWZ5IG1hcmtlciBnZW5lcwoKYGBge3IgSWRlbnRpZnkgU3ViY2x1c3RlciBNYXJrZXIgR2VuZXMsIG1lc3NhZ2U9RkFMU0V9CgojIEItY2VsbHMKIyBzZXQgaWRlbnRpdHkgb2YgY2VsbHMgZm9yIGZpbmRpbmcgbWFya2VycyB0byB0aGUgY2x1c3RlcnMgZGlzY292ZXJlZCB3aXRoIE1MRWNlbGwKSWRlbnRzKG9iamVjdCA9IGJjZWxsX3NldXJhdCkgPC0gYmNlbGxfc2V1cmF0QG1ldGEuZGF0YSQnYmNlbGxfc3ViY2x1c3QnIAoKYmNlbGxfTUxFX21hcmtlcnMgPC0gRmluZEFsbE1hcmtlcnMoYmNlbGxfc2V1cmF0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvbmx5LnBvcyA9IFRSVUUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1pbi5wY3QgPSAwLjI1LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2dmYy50aHJlc2hvbGQgPSAwLjI1KQoKYmNlbGxfTUxFX21hcmtlcnMgPC0gIG1lcmdlKGJjZWxsX01MRV9tYXJrZXJzLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhLmZyYW1lKGNvbnRhbVssYygiQi1jZWxsIiwgInBsYXNtYWJsYXN0IildKSwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBieS54ID0gJ2dlbmUnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgYnkueSA9ICdyb3cubmFtZXMnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgYWxsLng9VCkKCiMgUmV0cml2ZSB0b3Agc3RhdGlzdGljYWxseSBzaWduaWZpY2FudCBtYXJrZXJzCmJjZWxsX01MRV9tYXJrZXJzX3RvcDUgPC0gYmNlbGxfTUxFX21hcmtlcnMgJT4lCiAgZmlsdGVyKHBfdmFsX2FkaiA8IDAuMDEpICU+JQogICAgZ3JvdXBfYnkoY2x1c3RlcikgJT4lCiAgICBzbGljZV9tYXgobiA9IDUsIG9yZGVyX2J5ID0gYXZnX2xvZzJGQykKCiMgUGxvdCB0aGUgY2x1c3RlciBhbmQgdGhlIHRvcCB0aHJlZSBtYXJrZXJzIG9uIFVNQVAsIHdpdGggYW4gYWRkaXRpb25hbCBsYWJlbCBzaG93aW5nIHRoZSB0b3AgNSBnZW5lcyB3aXRoIGdlbmVzIGFmZmVjdGVkIGJ5IGNvbnRhbWluYXRpb24gaW4gUkVECmZvcihjbCBpbiB1bmlxdWUoYmNlbGxfTUxFX21hcmtlcnNfdG9wNSRjbHVzdGVyKSkgewogIAogIGRmIDwtIGJjZWxsX01MRV9tYXJrZXJzX3RvcDUgJT4lCiAgICBmaWx0ZXIoY2x1c3RlciA9PSBjbCkgJT4lCiAgICBhcnJhbmdlKGRlc2MoYXZnX2xvZzJGQykpCgogIHBsdHMgPC1sYXBwbHkoZGYkZ2VuZSwgZnVuY3Rpb24oeCkgewogICAgRmVhdHVyZVBsb3QoYmNlbGxfc2V1cmF0X2ZpbCwgeCwgbWF4LmN1dG9mZj0icTk5IiwgcHQuc2l6ZT0wLjIpICsgZ2d0aXRsZSh4KQogIH0pCiAgCiAgZGF0IDwtIGJjZWxsX3NldXJhdF9maWxAbWV0YS5kYXRhCiAgZGF0JGFscF9jbHVzdGVyIDwtIHNhcHBseShkYXQkYmNlbGxfc3ViY2x1c3QsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbih4KXsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoeD09Y2wpewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybigxKX0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4oMC4yKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9fSkKICBjb2xfcmVmX3RhYmxlIDwtIGRhdGEuZnJhbWUoYmNlbGxfc3ViY2x1c3QgPSBuZXcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsdXN0X2NvbG9yID0gYmNlbGxjb2xzWzE6bGVuZ3RoKG5ldyldKQogIGNvbF9yZWZfdGFibGUkY2x1c3RfY29sb3IgPC0gYXBwbHkoY29sX3JlZl90YWJsZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbih4KXsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKHhbMV09PWNsKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybih4WzJdKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuKCcjOUU5RTlFJykKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAKICBwNCA8LSBnZ3Bsb3QoZGF0LAogICAgICAgICAgICAgICBhZXMoeD1VTUFQXzEsCiAgICAgICAgICAgICAgICAgICB5PVVNQVBfMiwKICAgICAgICAgICAgICAgIGNvbG9yPWJjZWxsX3N1YmNsdXN0LAogICAgICAgICAgICAgICAgYWxwaGE9YWxwX2NsdXN0ZXIpKSArCiAgZ2VvbV9wb2ludChzaXplPTAuMikgKwogIHNjYWxlX2NvbG9yX21hbnVhbCh2YWx1ZXM9Y29sX3JlZl90YWJsZSRjbHVzdF9jb2xvcikgKwogIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbj0ibm9uZSIsCiAgICAgICAgcGxvdC5tYXJnaW49IG1hcmdpbigwLjUsNiwwLjUsMC41LHVuaXQ9J2NtJykpCiAgCiAgCiAgZGYkcHZhbF9hZGogPC0gc2FwcGx5KGRmJHBfdmFsX2FkaiwgZnVuY3Rpb24oeCkgc3ByaW50ZigiJS4yZSIsIHgpKQogIGRmJGxvZzJGQyA8LSBzYXBwbHkoZGYkYXZnX2xvZzJGQywgZnVuY3Rpb24oeCkgcm91bmQoeCwgZGlnaXRzID0gMikpCiAgICAKICBwNSA8LSBncmlkRXh0cmE6OnRhYmxlR3JvYihkZlssYygnZ2VuZScsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3BfdmFsX2FkaicsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2xvZzJGQycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3BjdC4xJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAncGN0LjInCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKV0pCiAgCiAgCiAgaWYobGVuZ3RoKHBsdHMpPT0xKSB7RzEgPC0gKHBsdHNbWzFdXSB8IHBsb3Rfc3BhY2VyKCkgfCBwbG90X3NwYWNlcigpKSAvIChwNHxwNXxwbG90X3NwYWNlcigpKSB9IGVsc2UgCiAgICBpZihsZW5ndGgocGx0cyk9PTIpIHtHMSA8LSAocGx0c1tbMV1dIHwgcGx0c1tbMl1dIHwgcGxvdF9zcGFjZXIoKSkgLyAocDR8cDV8cGxvdF9zcGFjZXIoKSkgfSBlbHNlCiAgICAgIHtHMSA8LSAocGx0c1tbMV1dIHwgcGx0c1tbMl1dIHwgcGx0c1tbM11dKSAvIChwNHxwNXxwbG90X3NwYWNlcigpKSB9CiAgCiAgZ2dzYXZlKHBhc3RlMCgnZmlndXJlcy9iY2VsbF9zdWJjbHVzdF8nLGNsLCdfbWFya2VyZ2VuZXMucG5nJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlcD0iIiksCiAgICAgICAgIEcxLAogICAgICAgICB3aWR0aD0xMCwKICAgICAgICAgaGVpZ2h0PTUsCiAgICAgICAgIHVuaXRzPSdpbicpCn0KCndyaXRlLmNzdihiY2VsbF9NTEVfbWFya2VycywgcGFzdGUwKCdiY2VsbF9NTEVfbWFya2Vycy5jc3YnKSkKCmBgYAoKCiMjIERFR3Mgb2YgaW50ZXJlc3QKCmBgYHtyfQpnb2kgPC0gYygnSUdITScsICdJR0hBMScsICdJR0hHMScsICdYQlAxJywgJ0hMQS1EUUExJywgJ0hMQS1EUEExJykKCiMgTWFrZSBhIGxpc3Qgb2YgZmVhdHVyZSBwbG90cwpmaWdzIDwtIGxhcHBseShnb2ksIGZ1bmN0aW9uKGcpIHsKICBGZWF0dXJlUGxvdChiY2VsbF9zZXVyYXRfZmlsLAogICAgICAgICAgICAgICAgICAgZmVhdHVyZXMgPSBnLAogICAgICAgICAgICAgIHB0LnNpemUgPSAwLjEsCiAgICAgICAgICAgICAgbWF4LmN1dG9mZiA9ICdxOTUnKSArIAogICAgIyMgYWRkIG15IHRoZW1lCiAgICBteV90aGVtZSArCiAgICAjIyBtYWtlIGl0IHB1YmxpY2F0aW9uIHJlYWR5CiAgICB0aGVtZSgKICAgICAgYXhpcy50ZXh0LnggPSBlbGVtZW50X2JsYW5rKCksCiAgICAgIGF4aXMudGV4dC55ID0gZWxlbWVudF9ibGFuaygpLAogICAgICBheGlzLnRpdGxlLnggPSBlbGVtZW50X2JsYW5rKCksCiAgICAgIGF4aXMudGl0bGUueSA9IGVsZW1lbnRfYmxhbmsoKSwKICAgICAgcGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChmYWNlID0gIml0YWxpYyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZSA9IDEwKSwKICAgICAgYXhpcy50aWNrcyA9IGVsZW1lbnRfYmxhbmsoKSwKICAgICAgbGVnZW5kLnBvc2l0aW9uID0gIm5vbmUiCil9KQoKIyBQdXQgZmVhdHVyZSBwbG90cyB0b2dldGhlcgpmYWNldGVkX3Bsb3QgPC0gd3JhcF9wbG90cyhwbG90bGlzdCA9IGZpZ3MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIG5jb2wgPSAyKQoKIyBQbG90IGl0Cmdnc2F2ZShmaWxlbmFtZSA9ICdmaWd1cmVzL2JjZWxsX3N1YmNsdXN0X2dvaS5zdmcnLAogICAgICAgcGxvdCA9IGZhY2V0ZWRfcGxvdCwKICAgICAgIHdpZHRoID0gMi41LAogICAgICAgaGVpZ2h0ID0gNCwKICAgICAgIHVuaXRzID0gImluIiwKICAgICAgIGRldmljZSA9IHN2ZykKCgoKCmBgYAoKIyBMdXB1cyB2cyBjb250cm9sIGFuYWx5c2VzCgojIyBOdW1iZXIgb2YgY2VsbHMKCmBgYHtyfQpkZiA8LSBiY2VsbF9zZXVyYXRAbWV0YS5kYXRhICU+JQogIGZpbHRlcighdGlzc3VlICVpbiUgYygiU1AyMF8xMDk4IiwgIlNQMjBfMTA4MzgiKSkgJT4lCiAgZ3JvdXBfYnkodGlzc3VlLCBkaXNlYXNlKSAlPiUKICBzdW1tYXJpemUobnVtYmVyX2JjZWxscyA9IG4oKSkKCndpbGNveC50ZXN0KHVubGlzdChkZlt3aGljaChkZiRkaXNlYXNlID09ICdDb250cm9sJyksICdudW1iZXJfYmNlbGxzJ10pLAogICAgICAgICAgICB1bmxpc3QoZGZbd2hpY2goZGYkZGlzZWFzZSA9PSAnTE4nKSwgJ251bWJlcl9iY2VsbHMnXSksCiAgICAgICAgICAgIGFsdGVybmF0aXZlID0gJ2xlc3MnKQoKCmdncGxvdChkZiwKICAgICAgIGFlcyh4ID0gZGlzZWFzZSwKICAgICAgICAgICB5ID0gbnVtYmVyX2JjZWxscywKICAgICAgICAgICBmaWxsID0gZGlzZWFzZSkpICsKICBnZW9tX2JveHBsb3Qob3V0bGllci5zaGFwZSA9IE5BKSArCiAgZ2VvbV9qaXR0ZXIoKSArCiAgc2NhbGVfZmlsbF9tYW51YWwodmFsdWVzID0gYygnIzA1NzFiMCcsICcjY2EwMDIwJykpICsKICB5bGFiKCdOdW1iZXIgb2YgQi1jZWxscycpICsKICB4bGFiKGxhYmVsID0gZWxlbWVudF9ibGFuaygpKSArCiAgdGhlbWUobGVnZW5kLnBvc2l0aW9uPSdub25lJykKCmdnc2F2ZShmaWxlID0gJ2ZpZ3VyZXMvbHVwdXNjb250cm9sc19udW1iY2VsbHMuc3ZnJywKICAgICAgIHdpZHRoID0gMS41LAogICAgICAgaGVpZ2h0ID0gMS41LAogICAgICAgZGV2aWNlID0gc3ZnKQoKCmBgYAoKIyMgTnVtYmVyIG9mIGVhY2ggc3ViY2x1c3RlcgpgYGB7cn0KZGYgPC0gYmNlbGxfc2V1cmF0QG1ldGEuZGF0YSAlPiUKICBmaWx0ZXIoIXRpc3N1ZSAlaW4lIGMoIlNQMjBfMTA5OCIsICJTUDIwXzEwODM4IikpICU+JQogIGdyb3VwX2J5KHRpc3N1ZSwgZGlzZWFzZSwgYmNlbGxfc3ViY2x1c3QpICU+JQogIHN1bW1hcml6ZShudW1iZXJfY2VsbHMgPSBuKCkpCgpsYXBwbHkodW5pcXVlKGRmJGJjZWxsX3N1YmNsdXN0KSwgZnVuY3Rpb24oY2wpIHsKICBkZiA8LSBkZlt3aGljaChkZiRiY2VsbF9zdWJjbHVzdCA9PSBjbCksXQogIHdpbGNveC50ZXN0KHVubGlzdChkZlt3aGljaChkZiRkaXNlYXNlID09ICdDb250cm9sJyksICdudW1iZXJfY2VsbHMnXSksCiAgICAgICAgICAgIHVubGlzdChkZlt3aGljaChkZiRkaXNlYXNlID09ICdMTicpLCAnbnVtYmVyX2NlbGxzJ10pKQp9KQoKZ2dwbG90KGRmLAogICAgICAgYWVzKHggPSBkaXNlYXNlLAogICAgICAgICAgIHkgPSBudW1iZXJfY2VsbHMsCiAgICAgICAgICAgZmlsbCA9IGRpc2Vhc2UpKSArCiAgZ2VvbV9ib3hwbG90KG91dGxpZXIuc2hhcGUgPSBOQSkgKwogIGdlb21faml0dGVyKHdpZHRoID0gMC4xNSkgKwogIHNjYWxlX2ZpbGxfbWFudWFsKHZhbHVlcyA9IGMoJyMwNTcxYjAnLCAnI2NhMDAyMCcpKSArCiAgZmFjZXRfd3JhcCh+YmNlbGxfc3ViY2x1c3QpICsKICB5bGFiKCdOdW1iZXIgb2YgQi1jZWxscycpICsKICB4bGFiKGxhYmVsID0gZWxlbWVudF9ibGFuaygpKSArCiAgdGhlbWUobGVnZW5kLnBvc2l0aW9uPSdub25lJykKCmdnc2F2ZShmaWxlID0gJ2ZpZ3VyZXMvbHVwdXNjb250cm9sc19udW1iY2VsbHNfc3ViY2x1c3Quc3ZnJywKICAgICAgIHdpZHRoID0gMy41LAogICAgICAgaGVpZ2h0ID0gMy41LAogICAgICAgZGV2aWNlID0gc3ZnKQoKCmBgYAoKCiMjIFByb3BvcnRpb24gb2YgZWFjaCBzdWJjbHVzdGVyCgpgYGB7cn0KYmNlbGxfc2V1cmF0QG1ldGEuZGF0YSA8LSBiY2VsbF9zZXVyYXRAbWV0YS5kYXRhWyx3aGljaCgKICAhKGR1cGxpY2F0ZWQoY29sbmFtZXMoYmNlbGxfc2V1cmF0QG1ldGEuZGF0YSkpKQopXQoKZGYgPC0gYmNlbGxfc2V1cmF0QG1ldGEuZGF0YSAlPiUKICBmaWx0ZXIoIXRpc3N1ZSAlaW4lIGMoIlNQMjBfMTA5OCIsICJTUDIwXzEwODM4IikpICU+JQogIGdyb3VwX2J5KHRpc3N1ZSwgZGlzZWFzZSwgYmNlbGxfdW5zdXAuY2x1c3QpICU+JQogIHN1bW1hcml6ZShudW1iZXJfY2VsbHMgPSBuKCkpICU+JQogIG11dGF0ZShmcmVxID0gbnVtYmVyX2NlbGxzL3N1bShudW1iZXJfY2VsbHMpKQoKCndpbGNveC50ZXN0KHVubGlzdChkZlt3aGljaChkZiRkaXNlYXNlID09ICdDb250cm9sJyksICdudW1iZXJfY2VsbHMnXSksCiAgICAgICAgICAgIHVubGlzdChkZlt3aGljaChkZiRkaXNlYXNlID09ICdMTicpLCAnbnVtYmVyX2NlbGxzJ10pKQoKZ2dwbG90KCkgKwogIGdlb21fYmFyKGRhdGEgPSBiY2VsbF9zZXVyYXRAbWV0YS5kYXRhLAogICAgICAgICAgIGFlcyh4ID0gZGlzZWFzZSwKICAgICAgICAgICAgICAgZmlsbCA9IGJjZWxsX3N1YmNsdXN0KSwKICAgICAgICAgICBwb3NpdGlvbiA9ICdmaWxsJywKICAgICAgICAgICBjb2xvciA9ICdibGFjaycpICsKICBnZW9tX3BvaW50KGRhdGEgPSBkYXRhLmZyYW1lKHk9YygwLjE1LCAwLjcwKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHg9YygnQ29udHJvbCcsICdMTicpKSwKICAgICAgICAgICAgIGFlcyh4PXgseT15KSwKICAgICAgICAgICAgIHNoYXBlPTgpICsKICBzY2FsZV9maWxsX21hbnVhbCh2YWx1ZXMgPSBiY2VsbGNvbHMsCiAgICAgICAgICAgICAgICAgICAgZ3VpZGUgPSBndWlkZV9sZWdlbmQodGl0bGUgPSAiQi1jZWxsXG5zdWJjbHVzdGVyIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrZXloZWlnaHQgPSAwLjUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga2V5d2lkdGggPSAwLjUpKSArCiAgc2NhbGVfeV9jb250aW51b3VzKGxhYmVscyA9IHNjYWxlczo6cGVyY2VudCkgKwogIHlsYWIobGFiZWwgPSBlbGVtZW50X2JsYW5rKCkpICsKICB4bGFiKGxhYmVsID0gZWxlbWVudF9ibGFuaygpKQogIAoKZ2dzYXZlKGZpbGUgPSAnZmlndXJlcy9sdXB1c2NvbnRyb2xzX3Byb3BzdWJjbHVzdHMuc3ZnJywKICAgICAgIHdpZHRoID0gMi41LAogICAgICAgaGVpZ2h0ID0gMywKICAgICAgIGRldmljZSA9IHN2ZykKCmBgYAoKIyBWaXN1YWwgYW5hbHlzZXMKCgojIyBMb2FkIGRhdGEgZm9yIHZpc3VhbCBhbmFseXNlcwogCmBgYHtyfQojIGxvYWQgZGF0YQp4eWNvb3JkcyA8LSBjdXN0b21sb2NzCnJvdy5uYW1lcyh4eWNvb3JkcykgPC0gY29sbmFtZXMocmF3KQoKIyBjYWxjdWxhdGUgcGFpcndpc2UgZGlzdGFuY2UgbWF0cmljZXMgZm9yIGFsbCBpbW11bmUgY2VsbHMKZGlzdHMgPC0gc2FwcGx5KHVuaXF1ZShhbm5vdCR0aXNzdWUpLCBmdW5jdGlvbih0aXMpIHsgCiAgCiAgY2VsbHMgPSBmaWx0ZXIoYW5ub3QsICh0aXNzdWUgPT0gdGlzICYKICAgICAgICAgICAgICAgICAgICAgICAgICAgIShjZWxsX0lEICVpbiUgSEJfY2VsbHMpICYgIyByZW1vdmUgaGVtb2dsb2JpbisgY2VsbHMgZnJvbSBpbW11bmUgY2VsbHMKICAgICAgICAgICAgICAgICAgICAgICAgYmFzaWN0eXBlICVpbiUgYygndGNlbGxfY2Q0JywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAndGNlbGxfY2Q4JywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnYmNlbGwnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdteWNlbGwnKSkpICU+JSBkcGx5cjo6c2VsZWN0KGNlbGxfSUQpICU+JSB1bmxpc3QKICByZXR1cm4oZGlzdCh4eWNvb3Jkc1tjZWxscyxdKSkKICAKICB9KQoKCgpgYGAKCgojIyBOdW1iZXIgb2YgY2VsbHMgd2l0aGluIDUwIGNlbGxzCgpUTyBwZXJmb3JtIHRoaXMgYW5hbHlzaXMsIGVhY2ggdGlzc3VlIG11c3QgYmUgYXNzZXNzZWQgaW5kZXBlbmRlbnRseSB0byBwcmV2ZW50IHRvbyBtdWNoeSBtZW1vcnkgZnJvbSBiZWluZyB1c2VkLgoKYGBge3J9CiMgZGVmaW5lIGZ1bmN0aW9uIHRoYXQgcmV0cmlldmVzIHRoZSA1MCBjbG9zZXN0IGNlbGxzIGZvciBhIGdpdmVuIHNldCBvZiAiY2VsbHMgb2YgaW50ZXJlc3QiCmZpbmRfY2xvc2VzdF9jZWxscyA8LSBmdW5jdGlvbihkaXN0YW5jZV9tYXRyaXgsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBudW1fY2xvc2VzdF9jZWxscywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvaXMgPSBzdWJzZXQoYW5ub3QsIGJhc2ljdHlwZSA9PSAnYmNlbGwnKSRjZWxsX0lEKSB7IAogIAogICMjIGZpbHRlciBmb3IgQiBjZWxscyBvbmx5CiAgZGlzdGFuY2VfbWF0cml4IDwtIHNhcHBseShjb2lzLCAKICAgICAgICAgICAgICAgIGZ1bmN0aW9uKGMpIHsKICAgICAgICAgICAgICAgICAgdXNlZGlzdDo6ZGlzdF9nZXQoZGlzdGFuY2VfbWF0cml4LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjZWxscykKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pCiAgcm93Lm5hbWVzKGRpc3RhbmNlX21hdHJpeCkgPC0gY2VsbHMKICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogIHByaW50KGRpbShkaXN0YW5jZV9tYXRyaXgpKQogIGNlbGxfbmFtZXMgPC0gcm93Lm5hbWVzKGRpc3RhbmNlX21hdHJpeCkKICBudW1fY2VsbHMgPC0gbmNvbChkaXN0YW5jZV9tYXRyaXgpCiAgY2xvc2VzdF9jZWxsc19saXN0IDwtIHZlY3RvcigibGlzdCIsIG51bV9jZWxscykKICAKICBmb3IgKGkgaW4gMTpudW1fY2VsbHMpIHsKICAgIGRpc3RhbmNlcyA8LSBkaXN0YW5jZV9tYXRyaXhbLGldCiAgICBjbG9zZXN0X2luZGljZXMgPC0gb3JkZXIoZGlzdGFuY2VzKVsxOm51bV9jbG9zZXN0X2NlbGxzXQogICAgCiAgICBjbG9zZXN0X2NlbGxfbmFtZXMgPC0gY2VsbF9uYW1lc1tjbG9zZXN0X2luZGljZXNdCiAgICBjbG9zZXN0X2NlbGxzX2xpc3RbW2ldXSA8LSBjbG9zZXN0X2NlbGxfbmFtZXMKICB9CiAgCiAgbmFtZXMoY2xvc2VzdF9jZWxsc19saXN0KSA8LSBjb2xuYW1lcyhkaXN0YW5jZV9tYXRyaXgpCiAgcmV0dXJuKGNsb3Nlc3RfY2VsbHNfbGlzdCkKfQoKIyBkZWZpbmUgZnVuY3Rpb24gdGhhdCB0YWtlcyBhIGxpc3Qgb2YgY2VsbHMgYW5kIGNvdW50cyB0aGUgbnVtYmVyIG9mIGltbXVuZSBjZWxscwpjb3VudF9pbW1fY2VsbHMgPC0gZnVuY3Rpb24oY2VsbF9saXN0KSB7CiAgCiAgYW5ub3Rfc3Vic2V0IDwtIHN1YnNldChhbm5vdCwgYmFzaWN0eXBlICVpbiUgKGMoJ2JjZWxsJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnbXljZWxsJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAndGNlbGwnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdOS2NlbGwnKSkpCiAgcmV0dXJuKHN1bShzYXBwbHkoY2VsbF9saXN0LCBmdW5jdGlvbihjKSB7YyAlaW4lIGFubm90X3N1YnNldCRjZWxsX0lEfSkpKQp9CgojIGl0ZXJhdGUgdGhyb3VnaCBlYWNoIHRpc3N1ZSBzYW1wbGUgdG8gYXNzZXNzIHRoZSBudW1iZXIgb2YgaW1tdW5lIGNlbGxzIG5leHQgdG8gZWFjaCBjZWxsCiMjIGluaXRpYWxpemUgZW1wdHkgbGlzdAp0aXNzdWVfaWRzIDwtIHVuaXF1ZShhbm5vdCR0aXNzdWUpCm51bV90aXNzdWVzIDwtIGxlbmd0aCh0aXNzdWVfaWRzKQp0aXNzdWVfYmNlbGxfbmltbXVuZV9jZWxscyA8LSB2ZWN0b3IoImxpc3QiLCBudW1fdGlzc3VlcykKCiMjIGl0ZXJhdGUgdGhyb3VnaCBlYWNoIHRpc3N1ZSdzIHh5Y29yZHM6CmZvcihpIGluIDE6bnVtX3Rpc3N1ZXMpIHsKICBwcmludChwYXN0ZTAoJ0FuYWx6eWluZyB0aXNzdWUgJywgdGlzc3VlX2lkc1tpXSkpCiAgIyMjIGNvbXB1dGUgZGlzdGFuY2UgbWF0cml4CiAgY2VsbHMgPSBmaWx0ZXIoYW5ub3QsICh0aXNzdWUgPT0gdGlzc3VlX2lkc1tpXSkpJGNlbGxfSUQKICBkaXN0YW5jZV9tYXRyaXggPC0gZGlzdCh4eWNvb3Jkc1tjZWxscyxdKQogIAogICMjIyBnZXQgNTAgY2xvc2VzdCBjZWxscyB0byBlYWNoIEIgY2VsbCAobm90IGNvdW50aW5nIHRoZSBjZWxsIGl0c2VsZi4uKQogIGNsb3Nlc3RfY2VsbHMgPC0gZmluZF9jbG9zZXN0X2NlbGxzKGRpc3RhbmNlX21hdHJpeCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA1MSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdWJzZXQoYW5ub3QsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChiYXNpY3R5cGUgPT0gJ2JjZWxsJyAmCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGlzc3VlID09IHRpc3N1ZV9pZHNbaV0pKSRjZWxsX0lEKSAgCiAgcm0oZGlzdGFuY2VfbWF0cml4KQogIGdjKCkgIyBzYXZlIG1lbW9yeQogICMjIyBjb3VudCBudW1iZXIgb2YgaW1tdW5lIGNlbGxzIGluIGVhY2ggbGlzdCBvZiA1MAogIGltbV9jZWxsX251bXMgPC0gbGFwcGx5KGNsb3Nlc3RfY2VsbHMsIGNvdW50X2ltbV9jZWxscykKICAjIyMgcG9wdWxhdGUgdGhlIGVtcHR5IGxpc3QKICB0aXNzdWVfYmNlbGxfbmltbXVuZV9jZWxsc1tbaV1dIDwtIGRhdGEuZnJhbWUoY2VsbF9JRCA9IG5hbWVzKGNsb3Nlc3RfY2VsbHMpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuX2ltbV9jZWxscyA9IHVubGlzdChpbW1fY2VsbF9udW1zKS0xKSAjIHJlbW92ZSBvbmUgZnJvbSBlYWNoIHRvIHJlbW92ZSBzZWxmCn0gCgp0aXNzdWVfYmNlbGxfbmltbXVuZV9jZWxsc19kZiA8LSBiaW5kX3Jvd3ModGlzc3VlX2JjZWxsX25pbW11bmVfY2VsbHMpCgojIyBwbG90IGRhdGEsIHNlcGFyYXRpbmcgY29udHJvbHMgYW5kIFNMRSBwYXRpZW50cwojIyMgUHJlcCBkYXRhCnRpc3N1ZV9iY2VsbF9uaW1tdW5lX2NlbGxzX2RmJGltbV9ob3RzcG90IDwtIGFzLm51bWVyaWModGlzc3VlX2JjZWxsX25pbW11bmVfY2VsbHNfZGYkbl9pbW1fY2VsbHMgPiAwKQp0aXNzdWVfYmNlbGxfbmltbXVuZV9jZWxsc19kZiA8LSBtZXJnZSh0aXNzdWVfYmNlbGxfbmltbXVuZV9jZWxsc19kZiwgYmNlbGxfc2V1cmF0QG1ldGEuZGF0YVssYygnYmNlbGxfc3ViY2x1c3QnLCAnZGlzZWFzZScpXSwgYnkgPSAncm93Lm5hbWVzJykKCgp0YWIgPC0gdGFibGUodGlzc3VlX2JjZWxsX25pbW11bmVfY2VsbHNfZGZbd2hpY2godGlzc3VlX2JjZWxsX25pbW11bmVfY2VsbHNfZGYkZGlzZWFzZT09J0xOJyksYygnYmNlbGxfc3ViY2x1c3QnLCAnaW1tX2hvdHNwb3QnKV0pCnRhYlssMV0gLyB0YWJbLDJdCgoKCiMjIyBjb2x1bW4gZm9yIHdoZXRoZXIgYSBjZWxsIGlzIGluIGFuIHR1YnVsb2ludGVyc3RpdGlhbCBob3RzcG90CmRmIDwtIHRpc3N1ZV9iY2VsbF9uaW1tdW5lX2NlbGxzX2RmCmRmJGNvbnRleHQgPC0gc2FwcGx5KGRmJGNlbGxfSUQsIGZ1bmN0aW9uKGNpKSB7YW5ub3RbY2ksJ2NvbnRleHQnXX0pCmRmJHR1Ymluc3RfaG90c3BvdCA8LSBzYXBwbHkoZGYkY29udGV4dCwgZnVuY3Rpb24oYykge2MgPT0gJ2hvdHNwb3QnfSkKCgojIyMgc2F2ZSBkZgp3cml0ZS5jc3YoZGYsIGZpbGUgPSAibnVtX2ltbV93aV81MC5jc3YiKQoKIyMjIHJlYWQgZGYKZGYgPC0gcmVhZC5jc3YoIm51bV9pbW1fd2lfNTAuY3N2Iiwgcm93Lm5hbWVzID0gMSkKCiMjIyBwbG90IGRhdGEKZ2dwbG90KGRmLAogICAgICAgYWVzKHggPSBuX2ltbV9jZWxscywKICAgICAgICAgICBmaWxsID0gYXMuZmFjdG9yKGNvbnRleHQpKSkgKwogIGdlb21faGlzdG9ncmFtKGNvbG9yID0gJ2JsYWNrJykgKwogIGZhY2V0X3dyYXAoZGlzZWFzZX4gYmNlbGxfc3ViY2x1c3QsCiAgICAgICAgICAgICBzY2FsZXMgPSAnZnJlZV95JywKICAgICAgICAgICAgIG5yb3cgPSAyKSArCiAgc2NhbGVfZmlsbF9tYW51YWwodmFsdWVzID0gYygnIzgwYjFkMycsICcjZmI4MDcyJywgJyNiZWJhZGEnLCAnI2ZkYjQ2MicpKSArCiAgeWxhYihsYWJlbCA9IGVsZW1lbnRfYmxhbmsoKSkgKwogIHhsYWIobGFiZWwgPSAnTnVtYmVyIG9mIE5lYXJieSBJbW11bmUgQ2VsbHMnKSArCiAgbGFicyhmaWxsID0gIkxvY2F0aW9uIikgKwogIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJib3R0b20iLAogICAgICAgIGxlZ2VuZC5rZXkuc2l6ZSA9IHVuaXQoMC4zLCAiY20iKSwKICAgICAgICBsZWdlbmQubWFyZ2luID0gbWFyZ2luKHQgPSAwLCB1bml0ID0gImNtIiksCiAgICAgICAgbGVnZW5kLnRpdGxlID0gZWxlbWVudF90ZXh0KHNpemUgPSAxMCkpCgpnZ3NhdmUoZmlsZSA9ICdmaWd1cmVzL2x1cHVzY29udHJvbHNfbnVtYmltbWNlbGxzX2xvY2F0aW9uX3N1YmNsdXN0LnN2ZycsCiAgICAgICB3aWR0aCA9IDYsCiAgICAgICBoZWlnaHQgPSAzLjUsCiAgICAgICBkZXZpY2UgPSBzdmcpCgpgYGAKCgoKIyMgTmV0d29yayBBbmFseXNpcwojIyMgSHlwZXJnZW9tZXRyaWMgZGlzdHMgY2x1c3QKCmBgYHtyfQojIGZpdCBoeXBlcmdlb21ldHJpYyBwYXJhbWV0ZXJzIGZvciBlYWNoIGNlbGwgdHlwZSBmb3IgZWFjaCBzYW1wbGUKYWRqX21hdHJpY2VzIDwtIGxhcHBseShkaXN0cywgZnVuY3Rpb24oZCkgeyAKICB0bXAgPC0gYW5ub3Rbd2hpY2goYW5ub3QkY2VsbF9JRCAlaW4lIGNvbG5hbWVzKGFzLm1hdHJpeChkKSkpLCBjKCdjZWxsX0lEJywgJ2NsdXN0JyldCiAgYW5ub3RfbGlzdCA8LSB0bXAkY2x1c3QKICBuYW1lcyhhbm5vdF9saXN0KSA8LSB0bXAkY2VsbF9JRAogIHJldHVybihtYWtlX2Fkal9tYXQoZCwKICAgICAgICAgICAgICAgICAgICAgIGFubm90X2xpc3QsCiAgICAgICAgICAgICAgICAgICAgICAwLjEpKQogIH0pOyBuYW1lcyhhZGpfbWF0cmljZXMpIDwtIG5hbWVzKGRpc3RzKQoKCiMgZ2V0IHBhcmFtZXRlcnMgZm9yIGh5cGVyZ2VvbWV0cmljIGRpc3RyaWJ1dGlvbgphZGpfbWF0cml4X2h5cGVycGFyYW1zIDwtIGxhcHBseShzZXEoMSwgbGVuZ3RoKGFkal9tYXRyaWNlcykpLCBmdW5jdGlvbihuKSB7CiAgcHJpbnQobikKICAjIyBkZWZpbmUgdGhlIG51bWJlciBvZiBjZWxsIHR5cGVzIHdpdGhpbiBlYWNoIGRpc3RhbmNlIG1hdHJpeCB1c2luZyB0aGUgYW5ub3QgZGF0YWZyYW1lCiAgIyMjIGdldCB0aGUgY2VsbHMgZnJvbSB0aGUgYW5ub3RhdGlvbiBkYXRhZnJhbWUKICBuY3R5cGVzIDwtIHRhYmxlKGFubm90W3doaWNoKGFubm90JGNlbGxfSUQgJWluJSBjb2xuYW1lcyhhcy5tYXRyaXgoZGlzdHNbW25dXSkpKSwgJ2NsdXN0J10pCiAgIyMjIHJlb3JkZXIgdGhlIG5jdHlwZXMgdG8gYmUgdGhlIHNhbWUgYXMgdGhlIGNvbHVtbnMgaW4gdGhlIGRhdGFzZXQKICBuY3R5cGVzIDwtIG5jdHlwZXNbY29sbmFtZXMoYWRqX21hdHJpY2VzW1tuXV0pXQogIG91dCA8LSBhZGpfbWF0X3RvX2h5cGVyZ2VvX3BhcmFtcyhhZGpfbWF0cmljZXNbW25dXSwKICAgICAgICAgICAgICAgICAgICAgICBuY3R5cGVzKQogIG91dCR0aXNzdWUgPC0gbmFtZXMoZGlzdHMpW25dCiAgcmV0dXJuKG91dCkKfSkgJT4lIGJpbmRfcm93cygpCgojIGxvb2sgYXQgdGhlIG5ldHdvcmtzIGNvbnRyb2wgdnMgbHVwdXMgY2FzZXMKIyMgZGVmaW5lIGNvbnRyb2wgYW5kIHNsZSBzYW1wbGVzCmNvbnRyb2xfc2FtcGxlcyA8LSB1bmlxdWUoYW5ub3Rbd2hpY2goYW5ub3QkY2xhc3MgPT0gJ2NvbnRyb2wnKSwndGlzc3VlJ10pCnNsZV9zYW1wbGVzIDwtIHVuaXF1ZShhbm5vdFt3aGljaChhbm5vdCRjbGFzcyAhPSAnY29udHJvbCcpLCAndGlzc3VlJ10pCmFkal9tYXRyaXhfaHlwZXJwYXJhbXMkZGlzZWFzZSA8LSAnY29udHJvbCcKYWRqX21hdHJpeF9oeXBlcnBhcmFtc1t3aGljaChhZGpfbWF0cml4X2h5cGVycGFyYW1zJHRpc3N1ZSAlaW4lIHNsZV9zYW1wbGVzKSwKICAgICAgICAgICAgICAgICAgICAgICAnZGlzZWFzZSddIDwtICdzbGUnCgphZGpfbWF0cml4X2h5cGVycGFyYW1zJGN0MS4yIDwtIHQoYXBwbHkoYWRqX21hdHJpeF9oeXBlcnBhcmFtc1ssYygnY3QxJywgJ2N0MicpXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uKHIpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhc3RlKHVubGlzdChyKSwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXAgPSAnXycpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSkpCgojIyBkbyB0aGUgZm9sbG93aW5nIHRvIGVhY2ggc2V0IG9mIHNhbXBsZXM6CiMjIyAoMSkgc3VtIGh5cGVyZ2VvbWV0cmljIGRpc3RyaWJ1dGlvbiBoeXBlcnBhcmFtZXRlcnMgKG0sIG4sIGspIGFuZCBvYnNlcnZlZCBlZGdlcyAoeCkKIyMjICgyKSBjYWxjdWxhdGUgdGhlIGV4cGVjdGVkIG51bWJlciBvZiBlZGdlcyAoZXhwZWN0ZWQuZWRnZXMpCiMjIyAoMykgY2FsY3VsYXRlIHRoZSBmb2xkIGluY3JlYXNlIG92ZXIgZXhwZWN0ZWQgKGZvbGQuaW5jcikKIyMjICg0KSBjYWxjdWxhdGUgYSBwLXZhbHVlCgpzbGUudi5jb250cm9sLmNsdXN0IDwtIGFkal9tYXRyaXhfaHlwZXJwYXJhbXMgJT4lIAogIGRwbHlyOjpncm91cF9ieShjdDEsIGN0MiwgZGlzZWFzZSkgJT4lCiAgc3VtbWFyaXNlKG0gPSBzdW0obSksCiAgICAgICAgICAgIG4gPSBzdW0obiksCiAgICAgICAgICAgIGsgPSBzdW0oayksCiAgICAgICAgICAgIHggPSBzdW0oeCksCiAgICAgICAgICAgIGV4cGVjdGVkLmVkZ2VzID0gbWF4KGMocWh5cGVyKHA9MC41LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtID0gc3VtKG0pLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrID0gc3VtKGspLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuID0gc3VtKG4pKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjUpKSwKICAgICAgICAgICAgcC52YWwgPSBtYXgoYyhwaHlwZXIocT1zdW0oeCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG09c3VtKG0pLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrPXN1bShrKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbj1zdW0obiksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvd2VyLnRhaWwgPSBGLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2cucCA9IEYpLAogICAgICAgICAgICAgICAgICAgICAgICAgIDFlLTMwKSkpCgojIGFkZCBsb2cyRkMgb2Ygb2JzZXJ2ZWQgb3ZlciBleHBlY3RlZApzbGUudi5jb250cm9sLmNsdXN0JGxvZzIuby5lIDwtIGxvZzIoc2xlLnYuY29udHJvbC5jbHVzdCR4L3NsZS52LmNvbnRyb2wuY2x1c3QkZXhwZWN0ZWQuZWRnZXMpCgojIyBhZGp1c3QgcC12YWx1ZSBmb3Igc2xlIGFuZCBjb250cm9scyBzZXBhcmF0ZWx5CiMjIyBzbGUKc2xlIDwtIHNsZS52LmNvbnRyb2wuY2x1c3Rbd2hpY2goc2xlLnYuY29udHJvbC5jbHVzdCRkaXNlYXNlID09ICdzbGUnKSxdCnNsZSRwLmFkaiA8LSBwLmFkanVzdChzbGUkcC52YWwsCiAgICAgICAgICAgICAgICAgICAgICBtZXRob2QgPSAnQkgnKQojIyMgY29udHJvbApjdHJsIDwtIHNsZS52LmNvbnRyb2wuY2x1c3Rbd2hpY2goc2xlLnYuY29udHJvbC5jbHVzdCRkaXNlYXNlID09ICdjb250cm9sJyksXSAgICAgICAgICAgIApjdHJsJHAuYWRqIDwtIHAuYWRqdXN0KGN0cmwkcC52YWwsCiAgICAgICAgICAgICAgICAgICAgICBtZXRob2QgPSAnQkgnKQoKCiMgcGxvdCB0aGUgcmVzdWx0cwojIyBtYWtlIGEga2V5IG9mIGFiYnJldmlhdGVkIG5hbWVzCmtleV9kZiA8LSB0KGRhdGEuZnJhbWUoYygnQi1jZWxsJywgIkJjIiksCiAgICAgICAgICAgICAgICAgICAgIGMoInBsYXNtYWJsYXN0IiwgIlBDIiksCiAgICAgICAgICAgICAgICAgICAgIGMoIm1hY3JvcGhhZ2UiLCAiTc+GIiksCiAgICAgICAgICAgICAgICAgICAgIGMoIm1hc3QiLCAiTWFzdCIpLAogICAgICAgICAgICAgICAgICAgICBjKCJtREMiLCAibURDIiksCiAgICAgICAgICAgICAgICAgICAgIGMoInBEQyIsICJwREMiKSwKICAgICAgICAgICAgICAgICAgICAgYygibW9ub2N5dGUiLCAiTW9ubyIpLAogICAgICAgICAgICAgICAgICAgICBjKCJuZXV0cm9waGlsIiwgIk5ldXQiKSwKICAgICAgICAgICAgICAgICAgICAgYygidGNlbGxfY2Q0IiwgIlRjNCIpLAogICAgICAgICAgICAgICAgICAgICBjKCJ0Y2VsbF9jZDgiLCAiVGM4IiksCiAgICAgICAgICAgICAgICAgICAgIGMoJ0IuMScsICdCLjEnKSwKICAgICAgICAgICAgICAgICAgICAgYygnQi4yJywgJ0IuMicpLAogICAgICAgICAgICAgICAgICAgICBjKCdCLjMnLCAnQi4zJyksCiAgICAgICAgICAgICAgICAgICAgIGMoJ0IuNCcsICdCLjQnKSkpCmtleV92ZWN0b3IgPC0ga2V5X2RmWywyXQpuYW1lcyhrZXlfdmVjdG9yKSA8LSBrZXlfZGZbLDFdCgojIyBtYWtlIGEgY29sb3IgY29kZWQgbGlzdApjb2xvcnMgPC0gYyhyZXAoJyM4ZGEwY2InLCAyKSwgcmVwKCcjZmM4ZDYyJywgNiksIHJlcCgnIzY2YzJhNScsIDIpLCByZXAoJyM4ZGEwY2InLCA0KSkKbmFtZXMoY29sb3JzKSA8LSBrZXlfZGZbLDJdCgojIyBhcHBseSB0aGUga2V5IHRvIHRoZSBzbGUgZGF0YXNldApzbGUkY3QxX2FiciA8LSBzYXBwbHkoc2xlJGN0MSwgZnVuY3Rpb24oYykge2tleV92ZWN0b3JbY119KQpzbGUkY3QyX2FiciA8LSBzYXBwbHkoc2xlJGN0MiwgZnVuY3Rpb24oYykge2tleV92ZWN0b3JbY119KQoKIyMgc2xlCnNsZS5maWwuZyA8LSBncmFwaF9mcm9tX2RhdGFfZnJhbWUoc2xlW3doaWNoKHNsZSRwLmFkaiA8IDAuMDEpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjKCdjdDFfYWJyJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnY3QyX2FicicsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2xvZzIuby5lJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAncC5hZGonCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKV0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlyZWN0ZWQgPSBGKQoKc2xlLmZpbC5nIDwtIHNldF92ZXJ0ZXhfYXR0cihzbGUuZmlsLmcsICJjb2xvciIsIHZhbHVlID0gY29sb3JzW2dldC52ZXJ0ZXguYXR0cmlidXRlKHNsZS5maWwuZywgIm5hbWUiKV0pCgojIyByZW1vdmUgc2VsZi1pbnRlcmFjdGluZyBub2RlcwpnIDwtIHNsZS5maWwuZwpzbGUuZmlsLmdfbm9zZWxmIDwtIGlncmFwaDo6c2ltcGxpZnkoZywgcmVtb3ZlLmxvb3BzID0gVFJVRSkKY3VzdG9tX2xheW91dCA8LSBsYXlvdXRfd2l0aF9mcihzbGUuZmlsLmdfbm9zZWxmKQoKCiMjIyB0cnkgdG8gcGxvdCB3aXRoIG5vcm1hbCBwbG90cwojIyMjIE5COiBuZWVkIHRvIGNvcHkgYW5kIHBhc3RlIGludG8gdGhlIGNvbnNvbGUsIGNhbm5vdCBydW4gZnJvbSBoZXJlCmRldi5uZXcobm9SU3R1ZGlvR0QgPSBUKQpzdmcoZmlsZW5hbWUgPSAnZmlndXJlcy9ncmFwaF9pbnRlcmFjdGlvbnNfc2xlLnN2ZycsCiAgICBvbmVmaWxlPVQpCnBsb3Qoc2xlLmZpbC5nX25vc2VsZiwKICAgICB2ZXJ0ZXgubGFiZWwgPSBWKHNsZS5maWwuZykkbmFtZSwKICAgICB2ZXJ0ZXguY29sb3IgPSBWKHNsZS5maWwuZykkY29sb3IsCiAgICAgZWRnZS5jb2xvciA9IGFkanVzdGNvbG9yKCJibGFjayIsIGFscGhhLmYgPSAwLjUpLAogICAgIGVkZ2Uud2lkdGggPSAyXkUoc2xlLmZpbC5nKSRsb2cyLm8uZSwKICAgICBsYXlvdXQgPSBjdXN0b21fbGF5b3V0LAogICAgIHZlcnRleC5sYWJlbC5mYW1pbHkgPSAiQXJpYWwiLAogICAgIHZlcnRleC5sYWJlbC5jb2xvciA9ICdibGFjaycsCiAgICAgdmVydGV4LmxhYmVsLmNleCA9IDAuOCwKICAgICB2ZXJ0ZXguc2l6ZSA9IDI1KQoKbGVnX2luY3IgPC0gYygyLDUsMTApCgpsZWdlbmQoInRvcGxlZnQiLAogICAgICAgbGVnZW5kPWFzLmNoYXJhY3RlcihsZWdfaW5jciksCiAgICAgICBjb2w9YWRqdXN0Y29sb3IoImJsYWNrIiwgYWxwaGEuZj0wLjUpLAogICAgICAgbHdkPWMobGVnX2luY3IpLAogICAgICAgdGl0bGU9Ik9icy9FeHAgSW50ZXJhY3Rpb25zIikKCmRldi5vZmYoKQoKCiMjIyBwbG90IGFzIGhlYXQtbWFwIHR5cGUgdGhpbmcKZ2dwbG90KHN1YnNldChzbGUsIHAuYWRqIDwgMC4wMSksCiAgICAgICBhZXMoeCA9IGN0MV9hYnIsCiAgICAgICAgICAgeSA9IGN0Ml9hYnIsCiAgICAgICAgICAgc2l6ZSA9IGxvZzIuby5lLAogICAgICAgICAgIGNvbG9yID0gbG9nMTAocC5hZGopKSkgKwogIGdlb21fcG9pbnQoKSArCiAgc2NhbGVfY29sb3JfdmlyaWRpc19iKCkgKwogIHRoZW1lKGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGFuZ2xlID0gNDUsIHZqdXN0ID0gMSwgaGp1c3QgPSAxKSkKCiMjIGNvbnRyb2wKIyMgYXBwbHkgdGhlIGtleSB0byB0aGUgc2xlIGRhdGFzZXQKY3RybCRjdDFfYWJyIDwtIHNhcHBseShjdHJsJGN0MSwgZnVuY3Rpb24oYykge2tleV92ZWN0b3JbY119KQpjdHJsJGN0Ml9hYnIgPC0gc2FwcGx5KGN0cmwkY3QyLCBmdW5jdGlvbihjKSB7a2V5X3ZlY3RvcltjXX0pCgpjdHJsLmZpbC5nIDwtIGdyYXBoX2Zyb21fZGF0YV9mcmFtZShjdHJsW3doaWNoKGN0cmwkcC5hZGogPCAwLjAxKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYygnY3QxX2FicicsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2N0Ml9hYnInLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdsb2cyLm8uZScsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3AuYWRqJwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICldLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpcmVjdGVkID0gRikKCmN0cmwuZmlsLmcgPC0gc2V0X3ZlcnRleF9hdHRyKGN0cmwuZmlsLmcsICJjb2xvciIsIHZhbHVlID0gY29sb3JzW2dldC52ZXJ0ZXguYXR0cmlidXRlKGN0cmwuZmlsLmcsICJuYW1lIildKQoKIyMgcmVtb3ZlIHNlbGYtaW50ZXJhY3Rpbmcgbm9kZXMKZyA8LSBjdHJsLmZpbC5nCmN0cmwuZmlsLmdfbm9zZWxmIDwtIGlncmFwaDo6c2ltcGxpZnkoZywgcmVtb3ZlLmxvb3BzID0gVFJVRSkKY3VzdG9tX2xheW91dCA8LSBsYXlvdXRfd2l0aF9mcihjdHJsLmZpbC5nX25vc2VsZikKCgojIyMgdHJ5IHRvIHBsb3Qgd2l0aCBub3JtYWwgcGxvdHMKIyMjIyBOQjogbmVlZCB0byBjb3B5IGFuZCBwYXN0ZSBpbnRvIHRoZSBjb25zb2xlLCBjYW5ub3QgcnVuIGZyb20gaGVyZQpkZXYubmV3KG5vUlN0dWRpb0dEID0gVCkKc3ZnKGZpbGVuYW1lID0gJ2ZpZ3VyZXMvZ3JhcGhfaW50ZXJhY3Rpb25zX2N0cmwuc3ZnJywKICAgIG9uZWZpbGU9VCkKcGxvdChjdHJsLmZpbC5nX25vc2VsZiwKICAgICB2ZXJ0ZXgubGFiZWwgPSBWKGN0cmwuZmlsLmcpJG5hbWUsCiAgICAgdmVydGV4LmNvbG9yID0gVihjdHJsLmZpbC5nKSRjb2xvciwKICAgICBlZGdlLmNvbG9yID0gYWRqdXN0Y29sb3IoImJsYWNrIiwgYWxwaGEuZiA9IDAuNSksCiAgICAgZWRnZS53aWR0aCA9IDJeRShjdHJsLmZpbC5nKSRsb2cyLm8uZSwKICAgICBsYXlvdXQgPSBjdXN0b21fbGF5b3V0LAogICAgIHZlcnRleC5sYWJlbC5mYW1pbHkgPSAiQXJpYWwiLAogICAgIHZlcnRleC5sYWJlbC5jb2xvciA9ICdibGFjaycsCiAgICAgdmVydGV4LmxhYmVsLmNleCA9IDAuOCwKICAgICB2ZXJ0ZXguc2l6ZSA9IDI1KQoKbGVnX2luY3IgPC0gYygyLDUsMTApCgpsZWdlbmQoImJvdHRvbXJpZ2h0IiwKICAgICAgIGxlZ2VuZD1hcy5jaGFyYWN0ZXIobGVnX2luY3IpLAogICAgICAgY29sPWFkanVzdGNvbG9yKCJibGFjayIsIGFscGhhLmY9MC41KSwKICAgICAgIGx3ZD1jKGxlZ19pbmNyKSwKICAgICAgIHRpdGxlPSJPYnMvRXhwIEludGVyYWN0aW9ucyIpCgpkZXYub2ZmKCkKCgoKYGBgCgoKCgoKIyMjIEh5cGVyZ2VvbWV0cmljIGRpc3Qgc3ViY2x1c3RzCgpSZXBlYXRpbmcgdGhlIGFuYWx5c2lzIGFib3ZlIGJ1dCBpbmNsdWRpbmcgQi1jZWxsIHN1YmNsdXN0ZXJzCgpgYGB7cn0KIyB1cGRhdGUgYW5ub3QgZGF0YWZyYW1lIHRvIGNvbWJpbmUgQi1jZWxsIHN1YmNsdXN0ZXJzIGluIGEgbmV3IGNvbHVtbiwgImNsdXN0X2JjZWxsc3ViY2wiCmFubm90JGNsdXN0X2JjZWxsc3ViY2wgPC0gYW5ub3QkY2x1c3QKYmNlbGxyb3dzIDwtIHdoaWNoKGFubm90JGNsdXN0ICVpbiUgYygnQi1jZWxsJywgJ3BsYXNtYWJsYXN0JykpCnJvdy5uYW1lcyhiY2VsbF9zZXVyYXRAbWV0YS5kYXRhKSA8LSBiY2VsbF9zZXVyYXRAbWV0YS5kYXRhJGNlbGxfSUQKYW5ub3RbYmNlbGxyb3dzLCdjbHVzdF9iY2VsbHN1YmNsJ10gPC0gYXMuY2hhcmFjdGVyKGJjZWxsX3NldXJhdEBtZXRhLmRhdGFbYW5ub3QkY2VsbF9JRFtiY2VsbHJvd3NdLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2JjZWxsX3N1YmNsdXN0J10pCgphbm5vdF9ub3JiY3MgPC0gYW5ub3Rbd2hpY2goIShpcy5uYShhbm5vdCRjbHVzdF9iY2VsbHN1YmNsKSkpLF0KCgojIENvbWJpbmUgVCBjZWxsIHN1YnNldHMgaW4gdGhlIGNsdXN0X2JjZWxsc3ViY2wKdGNlbGxzIDwtIHN1YnNldChhbm5vdCwgKChiYXNpY3R5cGUgPT0gJ3RjZWxsX2NkNCcpIHwgKGJhc2ljdHlwZSA9PSAndGNlbGxfY2Q4JykpKSRjZWxsX0lECmFubm90W3RjZWxscyxdJGNsdXN0X2JjZWxsc3ViY2wgPC0gYW5ub3RbdGNlbGxzLCdiYXNpY3R5cGUnXQoKIyBnZXQgYW4gYWRqYWNlbmN5IG1hdHJpeCBmb3IgYWxsIHN1YmNsdXN0ZXIgY2VsbHMKYWRqX21hdHJpY2VzX3N1YmNsdXN0IDwtIGxhcHBseShkaXN0cywgZnVuY3Rpb24oZCkgeyAKICB0bXAgPC0gYW5ub3Rfbm9yYmNzW3doaWNoKGFubm90X25vcmJjcyRjZWxsX0lEICVpbiUgY29sbmFtZXMoYXMubWF0cml4KGQpKSksIGMoJ2NlbGxfSUQnLCAnY2x1c3RfYmNlbGxzdWJjbCcpXQogIGFubm90X2xpc3QgPC0gdG1wJGNsdXN0X2JjZWxsc3ViY2wKICBuYW1lcyhhbm5vdF9saXN0KSA8LSB0bXAkY2VsbF9JRAogIHJldHVybihtYWtlX2Fkal9tYXQoZCwKICAgICAgICAgICAgICAgICAgICAgIGFubm90X2xpc3QsCiAgICAgICAgICAgICAgICAgICAgICAwLjEpKQogIH0pOyBuYW1lcyhhZGpfbWF0cmljZXNfc3ViY2x1c3QpIDwtIG5hbWVzKGRpc3RzKQoKCiMgZ2V0IHBhcmFtZXRlcnMgZm9yIGh5cGVyZ2VvbWV0cmljIGRpc3RyaWJ1dGlvbgphZGpfbWF0cml4X2h5cGVycGFyYW1zX3N1YmNsdXN0IDwtIGxhcHBseShzZXEoMSwgbGVuZ3RoKGFkal9tYXRyaWNlc19zdWJjbHVzdCkpLCBmdW5jdGlvbihuKSB7CiAgcHJpbnQobikKICAjIyBkZWZpbmUgdGhlIG51bWJlciBvZiBjZWxsIHR5cGVzIHdpdGhpbiBlYWNoIGRpc3RhbmNlIG1hdHJpeCB1c2luZyB0aGUgYW5ub3QgZGF0YWZyYW1lCiAgIyMjIGdldCB0aGUgY2VsbHMgZnJvbSB0aGUgYW5ub3RhdGlvbiBkYXRhZnJhbWUKICBuY3R5cGVzIDwtIHRhYmxlKGFubm90X25vcmJjc1t3aGljaChhbm5vdF9ub3JiY3MkY2VsbF9JRCAlaW4lIGNvbG5hbWVzKGFzLm1hdHJpeChkaXN0c1tbbl1dKSkpLCAnY2x1c3RfYmNlbGxzdWJjbCddKQogICMjIyByZW9yZGVyIHRoZSBuY3R5cGVzIHRvIGJlIHRoZSBzYW1lIGFzIHRoZSBjb2x1bW5zIGluIHRoZSBkYXRhc2V0CiAgbmN0eXBlcyA8LSBuY3R5cGVzW2NvbG5hbWVzKGFkal9tYXRyaWNlc19zdWJjbHVzdFtbbl1dKV0KICBvdXQgPC0gYWRqX21hdF90b19oeXBlcmdlb19wYXJhbXMoYWRqX21hdHJpY2VzX3N1YmNsdXN0W1tuXV0sCiAgICAgICAgICAgICAgICAgICAgICAgbmN0eXBlcykKICBvdXQkdGlzc3VlIDwtIG5hbWVzKGRpc3RzKVtuXQogIHJldHVybihvdXQpCn0pICU+JSBiaW5kX3Jvd3MoKQoKIyBsb29rIGF0IHN1YmNsdXN0ZXJzIGluIGNvbnRyb2wgdnMgbHVwdXMgc2FtcGxlcwphZGpfbWF0cml4X2h5cGVycGFyYW1zX3N1YmNsdXN0JGRpc2Vhc2UgPC0gJ2NvbnRyb2wnCmFkal9tYXRyaXhfaHlwZXJwYXJhbXNfc3ViY2x1c3Rbd2hpY2goYWRqX21hdHJpeF9oeXBlcnBhcmFtc19zdWJjbHVzdCR0aXNzdWUgJWluJSBzbGVfc2FtcGxlcyksCiAgICAgICAgICAgICAgICAgICAgICAgJ2Rpc2Vhc2UnXSA8LSAnc2xlJwoKc2xlLnYuY29udHJvbF9zdWJjbHVzdCA8LSBhZGpfbWF0cml4X2h5cGVycGFyYW1zX3N1YmNsdXN0ICU+JSAKICBkcGx5cjo6Z3JvdXBfYnkoY3QxLCBjdDIsIGRpc2Vhc2UpICU+JQogIHN1bW1hcmlzZShtID0gc3VtKG0pLAogICAgICAgICAgICBuID0gc3VtKG4pLAogICAgICAgICAgICBrID0gc3VtKGspLAogICAgICAgICAgICB4ID0gc3VtKHgpLAogICAgICAgICAgICBleHBlY3RlZC5lZGdlcyA9IG1heChjKHFoeXBlcihwPTAuNSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbSA9IHN1bShtKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgayA9IHN1bShrKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbiA9IHN1bShuKSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC41KSksCiAgICAgICAgICAgIHAudmFsID0gbWF4KGMocGh5cGVyKHE9c3VtKHgpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtPXN1bShtKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaz1zdW0oayksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG49c3VtKG4pLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb3dlci50YWlsID0gRiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9nLnAgPSBGKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAxZS0zMCkpKQoKCiMgYWRkIGxvZzJGQyBvZiBvYnNlcnZlZCBvdmVyIGV4cGVjdGVkCnNsZS52LmNvbnRyb2xfc3ViY2x1c3QkbG9nMi5vLmUgPC0gbG9nMihzbGUudi5jb250cm9sX3N1YmNsdXN0JHgvc2xlLnYuY29udHJvbF9zdWJjbHVzdCRleHBlY3RlZC5lZGdlcykKIyBhZGQgc2ltcGxlIHJhdGlvCnNsZS52LmNvbnRyb2xfc3ViY2x1c3Qkby5lIDwtIHNsZS52LmNvbnRyb2xfc3ViY2x1c3QkeC9zbGUudi5jb250cm9sX3N1YmNsdXN0JGV4cGVjdGVkLmVkZ2VzCgojIyBhZGp1c3QgcC12YWx1ZSBmb3Igc2xlIGFuZCBjb250cm9scyBzZXBhcmF0ZWx5CiMjIyBzbGUKc2xlIDwtIHNsZS52LmNvbnRyb2xfc3ViY2x1c3Rbd2hpY2goc2xlLnYuY29udHJvbF9zdWJjbHVzdCRkaXNlYXNlID09ICdzbGUnKSxdCnNsZSRwLmFkaiA8LSBwLmFkanVzdChzbGUkcC52YWwsCiAgICAgICAgICAgICAgICAgICAgICBtZXRob2QgPSAnQkgnKQpzbGVbd2hpY2goc2xlJHAuYWRqID09IDApLCdwLmFkaiddIDwtIDFlLTMwCgojIyMgY29udHJvbApjdHJsIDwtIHNsZS52LmNvbnRyb2xfc3ViY2x1c3Rbd2hpY2goc2xlLnYuY29udHJvbF9zdWJjbHVzdCRkaXNlYXNlID09ICdjb250cm9sJyksXSAgICAgICAgICAgIApjdHJsJHAuYWRqIDwtIHAuYWRqdXN0KGN0cmwkcC52YWwsCiAgICAgICAgICAgICAgICAgICAgICBtZXRob2QgPSAnQkgnKQoKCgojIHBsb3QgdGhlIHJlc3VsdHMKIyMgYXBwbHkgdGhlIGtleSB0byB0aGUgc2xlIGRhdGFzZXQKc2xlJGN0MV9hYnIgPC0gc2FwcGx5KHNsZSRjdDEsIGZ1bmN0aW9uKGMpIHtrZXlfdmVjdG9yW2NdfSkKc2xlJGN0Ml9hYnIgPC0gc2FwcGx5KHNsZSRjdDIsIGZ1bmN0aW9uKGMpIHtrZXlfdmVjdG9yW2NdfSkKCiMjIHNsZQpzbGUuZmlsLmcgPC0gZ3JhcGhfZnJvbV9kYXRhX2ZyYW1lKHNsZVt3aGljaChzbGUkcC5hZGogPCAwLjAxKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYygnY3QxX2FicicsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2N0Ml9hYnInLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdsb2cyLm8uZScsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3AuYWRqJwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICldLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpcmVjdGVkID0gRikKCnNsZS5maWwuZyA8LSBzZXRfdmVydGV4X2F0dHIoc2xlLmZpbC5nLCAiY29sb3IiLCB2YWx1ZSA9IGNvbG9yc1tnZXQudmVydGV4LmF0dHJpYnV0ZShzbGUuZmlsLmcsICJuYW1lIildKQoKIyMgcmVtb3ZlIHNlbGYtaW50ZXJhY3Rpbmcgbm9kZXMKZyA8LSBzbGUuZmlsLmcKc2xlLmZpbC5nX25vc2VsZiA8LSBpZ3JhcGg6OnNpbXBsaWZ5KGcsIHJlbW92ZS5sb29wcyA9IFRSVUUpCmN1c3RvbV9sYXlvdXQgPC0gbGF5b3V0X3dpdGhfZnIoc2xlLmZpbC5nX25vc2VsZikKCgojIyMgdHJ5IHRvIHBsb3Qgd2l0aCBub3JtYWwgcGxvdHMKIyMjIyBOQjogbmVlZCB0byBjb3B5IGFuZCBwYXN0ZSBpbnRvIHRoZSBjb25zb2xlLCBjYW5ub3QgcnVuIGZyb20gaGVyZQpkZXYubmV3KG5vUlN0dWRpb0dEID0gVCkKc3ZnKGZpbGVuYW1lID0gJ2ZpZ3VyZXMvZ3JhcGhfaW50ZXJhY3Rpb25zX3NsZS5zdmcnLAogICAgb25lZmlsZT1UKQpwbG90KHNsZS5maWwuZ19ub3NlbGYsCiAgICAgdmVydGV4LmxhYmVsID0gVihzbGUuZmlsLmcpJG5hbWUsCiAgICAgdmVydGV4LmNvbG9yID0gVihzbGUuZmlsLmcpJGNvbG9yLAogICAgIGVkZ2UuY29sb3IgPSBhZGp1c3Rjb2xvcigiYmxhY2siLCBhbHBoYS5mID0gMC41KSwKICAgICBlZGdlLndpZHRoID0gMl5FKHNsZS5maWwuZykkbG9nMi5vLmUsCiAgICAgbGF5b3V0ID0gY3VzdG9tX2xheW91dCwKICAgICB2ZXJ0ZXgubGFiZWwuZmFtaWx5ID0gIkFyaWFsIiwKICAgICB2ZXJ0ZXgubGFiZWwuY29sb3IgPSAnYmxhY2snLAogICAgIHZlcnRleC5sYWJlbC5jZXggPSAwLjgsCiAgICAgdmVydGV4LnNpemUgPSAyNSkKCmxlZ19pbmNyIDwtIGMoMiw1LDEwKQoKbGVnZW5kKCJ0b3BsZWZ0IiwKICAgICAgIGxlZ2VuZD1hcy5jaGFyYWN0ZXIobGVnX2luY3IpLAogICAgICAgY29sPWFkanVzdGNvbG9yKCJibGFjayIsIGFscGhhLmY9MC41KSwKICAgICAgIGx3ZD1jKGxlZ19pbmNyKSwKICAgICAgIHRpdGxlPSJPYnMvRXhwIEludGVyYWN0aW9ucyIpCgpkZXYub2ZmKCkKCgojIyBjb250cm9sCiMjIGFwcGx5IHRoZSBrZXkgdG8gdGhlIHNsZSBkYXRhc2V0CmN0cmwkY3QxX2FiciA8LSBzYXBwbHkoY3RybCRjdDEsIGZ1bmN0aW9uKGMpIHtrZXlfdmVjdG9yW2NdfSkKY3RybCRjdDJfYWJyIDwtIHNhcHBseShjdHJsJGN0MiwgZnVuY3Rpb24oYykge2tleV92ZWN0b3JbY119KQoKY3RybC5maWwuZyA8LSBncmFwaF9mcm9tX2RhdGFfZnJhbWUoY3RybFt3aGljaChjdHJsJHAuYWRqIDwgMC4wMSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGMoJ2N0MV9hYnInLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdjdDJfYWJyJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnbG9nMi5vLmUnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdwLmFkaicKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaXJlY3RlZCA9IEYpCgpjdHJsLmZpbC5nIDwtIHNldF92ZXJ0ZXhfYXR0cihjdHJsLmZpbC5nLCAiY29sb3IiLCB2YWx1ZSA9IGNvbG9yc1tnZXQudmVydGV4LmF0dHJpYnV0ZShjdHJsLmZpbC5nLCAibmFtZSIpXSkKCiMjIHJlbW92ZSBzZWxmLWludGVyYWN0aW5nIG5vZGVzCmcgPC0gY3RybC5maWwuZwpjdHJsLmZpbC5nX25vc2VsZiA8LSBpZ3JhcGg6OnNpbXBsaWZ5KGcsIHJlbW92ZS5sb29wcyA9IFRSVUUpCmN1c3RvbV9sYXlvdXQgPC0gbGF5b3V0X3dpdGhfZnIoY3RybC5maWwuZ19ub3NlbGYpCgoKIyMjIHRyeSB0byBwbG90IHdpdGggbm9ybWFsIHBsb3RzCiMjIyMgTkI6IG5lZWQgdG8gY29weSBhbmQgcGFzdGUgaW50byB0aGUgY29uc29sZSwgY2Fubm90IHJ1biBmcm9tIGhlcmUKZGV2Lm5ldyhub1JTdHVkaW9HRCA9IFQpCnN2ZyhmaWxlbmFtZSA9ICdmaWd1cmVzL2dyYXBoX2ludGVyYWN0aW9uc19jdHJsLnN2ZycsCiAgICBvbmVmaWxlPVQpCnBsb3QoY3RybC5maWwuZ19ub3NlbGYsCiAgICAgdmVydGV4LmxhYmVsID0gVihjdHJsLmZpbC5nKSRuYW1lLAogICAgIHZlcnRleC5jb2xvciA9IFYoY3RybC5maWwuZykkY29sb3IsCiAgICAgZWRnZS5jb2xvciA9IGFkanVzdGNvbG9yKCJibGFjayIsIGFscGhhLmYgPSAwLjUpLAogICAgIGVkZ2Uud2lkdGggPSAyXkUoY3RybC5maWwuZykkbG9nMi5vLmUsCiAgICAgbGF5b3V0ID0gY3VzdG9tX2xheW91dCwKICAgICB2ZXJ0ZXgubGFiZWwuZmFtaWx5ID0gIkFyaWFsIiwKICAgICB2ZXJ0ZXgubGFiZWwuY29sb3IgPSAnYmxhY2snLAogICAgIHZlcnRleC5sYWJlbC5jZXggPSAwLjgsCiAgICAgdmVydGV4LnNpemUgPSAyNSkKCmxlZ19pbmNyIDwtIGMoMiw1LDEwKQoKbGVnZW5kKCJ0b3ByaWdodCIsCiAgICAgICBsZWdlbmQ9YXMuY2hhcmFjdGVyKGxlZ19pbmNyKSwKICAgICAgIGNvbD1hZGp1c3Rjb2xvcigiYmxhY2siLCBhbHBoYS5mPTAuNSksCiAgICAgICBsd2Q9YyhsZWdfaW5jciksCiAgICAgICB0aXRsZT0iT2JzL0V4cCBJbnRlcmFjdGlvbnMiKQoKZGV2Lm9mZigpCgoKYGBgCgoKIyMjIFByb3BvcnRpb24gb2YgZWFjaCBpbnRlcmFjdGlvbiB0eXBlIHRoYXQgb2NjdXIgd2l0aGluIGhvdHNwb3RzIHZzIG90aGVyIGFyZWFzCgpgYGB7cn0KIyBtYWtlIGFkamFjZW5jeSBtYXRyaXggb2YgYWxsIGltbXVuZSBjZWxscwphZGpfbWF0cmljZXNfaW1tcyA8LSBsYXBwbHkoZGlzdHMsIGZ1bmN0aW9uKGQpIHsgCiAgdG1wIDwtIGFubm90W3doaWNoKGFubm90JGNlbGxfSUQgJWluJSByb3duYW1lcyhhcy5tYXRyaXgoZCkpKSwgYygnY2VsbF9JRCcsICdjbHVzdF9iY2VsbHN1YmNsJyldCiAgYW5ub3RfbGlzdCA8LSB0bXAkY2x1c3QKICBuYW1lcyhhbm5vdF9saXN0KSA8LSB0bXAkY2VsbF9JRAogIHJldHVybihtYWtlX2Fkal9tYXQoZCwKICAgICAgICAgICAgICAgICAgICAgIGFubm90X2xpc3QsCiAgICAgICAgICAgICAgICAgICAgICAwLjEsCiAgICAgICAgICAgICAgICAgICAgICBjb2xsYXBzZV9xdWVyeSA9IEYpKSB9KSAlPiUKICBiaW5kX3Jvd3MoKSAlPiUgCiAgIyMgbWVyZ2UgaW4gaW5mb3JtYXRpb24gYWJvdXQgbG9jYXRpb24gb2YgdGhlIHF1ZXJ5IGNlbGxzCiAgbWVyZ2UoLiwKICAgICAgICBiY2VsbF9zZXVyYXRAbWV0YS5kYXRhWyxjKCdjZWxsX0lEJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdkaXNlYXNlJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdjb250ZXh0JyldLAogICAgICAgIGJ5LnggPSAncm93Lm5hbWVzJywKICAgICAgICBieS55ID0gJ2NlbGxfSUQnKQogIAogICMjIHJlbmFtZSB0aGUgY2VsbF9JRCBjb2x1bW4KICBjb2xuYW1lcyhhZGpfbWF0cmljZXNfaW1tcylbMV0gPC0gImNlbGxfSUQiCiAgCiAgIyMgcmVwbGFjZSBOQSB3aXRoIDAKICBhZGpfbWF0cmljZXNfaW1tcyA8LSByZXBsYWNlKGFkal9tYXRyaWNlc19pbW1zLCBpcy5uYShhZGpfbWF0cmljZXNfaW1tcyksIDApCgojIGZpbHRlciBmb3IganVzdCBCLjMgY2VsbHMgaW4gTE4KIyBtYWtlIGEgZGF0YWZyYW1lIHdpdGggdGhlIG51bWJlciBvZiBpbnRlcmFjdGlvbnMgZm9yIGVhY2ggZ3JvdXAgd2l0aGluIGVhY2ggY29udGV4dApjZWxsX3R5cGVzIDwtIGNvbG5hbWVzKGFkal9tYXRyaWNlc19pbW1zKVsyOjEzXQpkZiA8LSBhZGpfbWF0cmljZXNfaW1tcyAlPiUgc3Vic2V0KGNlbGx0eXBlID09ICdCLjMnICYgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaXNlYXNlID09ICdMTicpICU+JQogIGdyb3VwX2J5KGNvbnRleHQpICU+JQogIHN1bW1hcmlzZShhY3Jvc3MoYWxsX29mKGNlbGxfdHlwZXMpLCBzdW0sIC5uYW1lcyA9ICJ7LmNvbH0iKSkgJT4lCiAgdCguKSAlPiUgYXMuZGF0YS5mcmFtZSgpOyBjb2xuYW1lcyhkZikgPC0gZGZbMSxdOyBkZiA8LSBkZlstMSxdCgojIG1lbHQgdGhlIGRmIHN1Y2ggdGhhdCBpdCBjYW4gYmUgcGxvdHRlIGluIGdncGxvdDIKZGYkaW50ZXJhY3RpbmdfY2VsbCA8LSByb3cubmFtZXMoZGYpCmRmX3Bsb3QgPC0gbWVsdChkZiwgaWQudmFycyA9ICdpbnRlcmFjdGluZ19jZWxsJykKZGZfcGxvdCR2YWx1ZSA8LSBhcy5udW1lcmljKGRmX3Bsb3QkdmFsdWUpCmRmX3Bsb3RfcHJvcHMgPC0gZGZfcGxvdCAlPiUgZ3JvdXBfYnkoaW50ZXJhY3RpbmdfY2VsbCkgJT4lIHN1bW1hcmlzZShjb250ZXggPSB2YXJpYWJsZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb3BfY29udGV4ID0gdmFsdWUgLyBzdW0odmFsdWUpKQpkZl9wbG90X25zIDwtIGRmX3Bsb3QgJT4lIGdyb3VwX2J5KGludGVyYWN0aW5nX2NlbGwpICU+JSBzdW1tYXJpc2UodG90biA9IHN1bSh2YWx1ZSkpCgoKcGx0IDwtIGdncGxvdCgpICsgCiAgZ2VvbV9iYXIoZGF0YSA9IGRmX3Bsb3RfcHJvcHMsCiAgICAgICAgICAgYWVzKHggPSBpbnRlcmFjdGluZ19jZWxsLCAKICAgICAgICAgICAgICAgeSA9IHByb3BfY29udGV4LCAKICAgICAgICAgICAgICAgZmlsbCA9IGNvbnRleCksCiAgICAgICAgICAgY29sb3IgPSAnYmxhY2snLAogICAgICAgICAgIHN0YXQgPSAnaWRlbnRpdHknKSArCiAgZ2VvbV90ZXh0KGRhdGEgPSBkZl9wbG90X25zLAogICAgICAgICAgICBhZXMoeCA9IGludGVyYWN0aW5nX2NlbGwsCiAgICAgICAgICAgICAgICB5ID0gMS4wNSwKICAgICAgICAgICAgICAgIGFuZ2xlID0gNDUsCiAgICAgICAgICAgICAgICBsYWJlbCA9IHRvdG4pLAogICAgICAgICAgICBzaXplID0gMywKICAgICAgICAgICAgaGp1c3QgPSAwKSArCiAgc2NhbGVfZmlsbF9tYW51YWwodmFsdWVzID0gYygnIzgwYjFkMycsICcjZmI4MDcyJywgJyNiZWJhZGEnLCAnI2ZkYjQ2MicpKSArCiAgc2NhbGVfeV9jb250aW51b3VzKGV4cGFuZCA9IGV4cGFuZF9zY2FsZShtdWx0ID0gYygwLCAwLjEyKSksCiAgICAgICAgICAgICAgICAgICAgIGJyZWFrcyA9IHNlcSgwLDEsMC4yNSkpICsKICBzY2FsZV94X2Rpc2NyZXRlKGV4cGFuZCA9IGV4cGFuZF9zY2FsZShtdWx0ID0gYygwLCAwLjEpKSkgKwogIHRoZW1lKGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGFuZ2xlID0gNDUsIGhqdXN0ID0gMSksCiAgICAgICAgYXhpcy50aXRsZS55ID0gZWxlbWVudF9ibGFuaygpKSArCiAgeGxhYihsYWJlbCA9ICdCLjMtaW50ZXJhY3RpbmcgQ2VsbCcpICsKICBsYWJzKGZpbGwgPSAiQ29udGV4dCIpCiAgCiAgCmdnc2F2ZShwbHQsCiAgICAgICBmaWxlID0gJ2ZpZ3VyZXMvQjNfaW50ZXJhY3Rpb25jb250ZXh0X1NMRS5zdmcnLAogICAgICAgd2lkdGggPSA1LAogICAgICAgaGVpZ2h0ID0gMy41LAogICAgICAgZGV2aWNlID0gc3ZnKQoKYGBgCgo=